2014-06-15 89 views
0

我試圖在數學表達式中匹配變量元素的運算符(例如,「1 x < 10」的結果爲真,假設是3 < x < 10)。注意,這是不同於大多數語言將會解析表達式) (簡化)生產的規則是:N元運算符解析

expression: '(' expression ')'     # parenthesisExpression 
     | expression ('*' | '/' | '%') expression # multiplicationExpression 
     | expression ('+' | '-') expression  # additionExpression 
     | expression (SMALLER_THAN expression)+ # smallerThanExpression 
     | IDENTIFIER        # variableExpression 
     ; 

我們如何保持優先級,但仍解析smallerThanExpression貪婪的可能嗎?

例如; 「1 < 1 + 1 < 3」應該被解析爲具有三個子節點的單個解析節點「smallerThanExpression」,其中每個節點都是表達式。此時,較小的表達式在兩個較小的表達式中分解(1 <(1 + 1 < 3))。

回答

1

爲了給「後代」一個答案:我們通過將算術表達式與其他表達式分開來解決它。我們知道只有算術表達式可以用作我們的變量運算符('true < false'不是有效的表達式)的操作數。

expression: 
     '!' expression 
     | arithmetic (SMALLER_THAN arithmetic)+ 
     | arithmetic (GREATER_THAN arithmetic)+ 
     | .... 
     ; 

arithmetic: 
     '(' expression ')'     
     | expression ('*' | '/' | '%') expression 
     | expression ('+' | '-') expression 
     | IDENTIFIER 
     | ... 
     ; 

這加強了的表達,如「×<Ÿ< z」的將被解析爲與兒童三個「算術」節點的單個「表達」節點。

(請注意,標識符可能指的是非整數對象;在上下文檢查程序中會對此進行檢查)