2015-05-13 159 views
0

我正在使用TinyPG(它是LL1解析器生成器)解析lambda微積分。我試圖編寫一個規則來解析函數應用程序,如(a b)(a b c)等等。使用LL1解析器解析lambda微積分樣式函數應用程序

到目前爲止,我有這個規則(有點簡化):

APPLICATION -> LPARENTHESES VARIABLE (SPACE+ VARIABLE)+ RPARENTHESES; 

但是,這會導致解析,左後,右括號前有空格的一個術語:(a b)。我可以在開頭支架後面留出空格,如下所示:

APPLICATION -> LPARENTHESES SPACE* VARIABLE (SPACE+ VARIABLE)+ RPARENTHESES; 

但是我很難將它設置爲允許右括號之前的空格。我想出了這一點,這似乎工作:

ARG_LIST  -> (RPARENTHESES | (SPACE+ (RPARENTHESES | (VARIABLE ARG_LIST)))); 
APPLICATION  -> LPARENTHESES SPACE* VARIABLE ARG_LIST; 

不過是混亂和遞歸的,那麼這將使它難以閱讀和編寫的節點。有沒有非遞歸或至少更簡單的方法來解析這個?

+0

你看過教程中的空白處理嗎? (搜索'[Skip]') – rici

+0

是的,但是會跳過每一個空格,包括每個參數之間不應該跳過的空格。 – Juan

+0

爲什麼不能跳過?跳過並不意味着「已刪除」:它表示「已識別然後被忽略」。遇到空白字符時,VARIABLE標記仍然會結束。試試看看。 – rici

回答

1

沒有理由將解析器與空白混淆。這是足以讓它在掃描儀使用在本教學中[Skip]屬性被忽略:

[Skip] WHITESPACE -> @"\s+"; 

「跳過」並不意味着「刪除」。這意味着掃描器應該識別該令牌,然後忽略它。如果跳過空格,空格仍然會分隔字母數字令牌。你只是不需要在你的語法空間的道理,留給你:

APPLICATION -> LPARENTHESES VARIABLE VARIABLE+ RPARENTHESES; 

(事實上,空的應用程序列表通常是允許的,所以我寫了*而不是+。但這是你的語言。)