2017-07-04 33 views
0

產生式規則的某些標記模式假設我們有生產規則表達可以LogicExpressionMathExpressionStringExpression,並ListExpression之間進行選擇。排除在JavaCC的

void Expression() #void: {} 
{ 
    LOOKAHEAD(3) LogicExpression() | LOOKAHEAD(3) MathExpression() | 
    LOOKAHEAD(2) StringExpression() | ListExpression() 
} 

的這些生產規則可以評估到令牌標識符所有四種,是因爲該標識符解析爲LogicExpression,而不是整個事情解決的MathExpression表達標識符+ 1會遇到一個ParseException 。有沒有辦法將單獨的標識符排除在生產規則之外?

+0

不要嘗試用語法進行類型檢查。只需識別表達式,並檢查操作數類型在解析語義分析過程中對每個操作符是否有意義。 – rici

回答

0

號沒有一個簡單的方法來匹配相匹配的模式X除了那些匹配模式Y.

那不過這不是你的問題的一切。你的問題似乎是你想解析表達式。有一個直接的方法來做到這一點。

void Expression() #void: {} 
{ 
    LOOKAHEAD(LogicExpression()) 
    LogicExpression() 
| 
    LOOKAHEAD(MathExpression()) 
    MathExpression() 
| 
    LOOKAHEAD(StringExpression()) 
    StringExpression() 
| 
    ListExpression() 
} 

對於可以通過多個選項進行更多匹配的輸入,可以選擇有效的第一個選項。