2015-05-14 42 views
1

我正在開發學習antlr的'玩具'語言。ANTLR - 如何在'for'循環中跳過缺少的標記

我的結構爲for循環看起來像這樣。

for(4,10){ //program expressions };

我有一個語法,我認爲作品,但它是一個有點難看。具體而言,我不確定我是否很好地處理了語義上不重要的標記。

例如,在中間的逗號有顯示爲一個符號,但它不重要解析器,它只是需要在2和3的循環邊界。這意味着,當我看到loop令牌部分的child()元素時,我不得不跳過不重要的元素。

如果您檢查ANTLR查看器並查看解析樹,則可能會看到最佳效果。紅色箭頭指向我認爲是多餘的令牌。

enter image description here

覺得我應該更多地利用了skip()功能比我,但我不能看到如何插入語法這一級的標記。

loop: 'for(' foridxitem ',' foridxitem '){' (programexpression)+ '}'; foridxitem: NUM #ForIndexNumÌ | var #ForIndexVar;

回答

1

簡短的回答是ANTLR的生成語法樹,所以總是會有克魯夫特邁過或行走的樹時,否則忽略。

較長答案是,有在詞法分析器跳過cruft的和產生適中但必要寫入明確的規則限制句法值的令牌之間的張力。

例如,你認for(爲跳過的候選人,但可能是語法要求。相反,參數逗號可以沒有語法意義。所以,你可能會在詞法分析器(和語法分析器)這種方式清理:

FOR: 'for(' -> pushMode(params) ; 
ENDLOOP: '}' ; 
WS: .... -> skip() ; 

mode params; 
NUM: .... ; 
VAR: .... ; 
COMMA: ',' -> skip() ; 
ENDPARAMS: '){' -> skip(), popMode() ; 
P_WS: .... -> skip() ; 

你parer規則就變成

loop: FOR foridxitem* programexpression+ ENDLOOP ; 
foridxitem: NUM | VAR ; 
programexpression: .... ; 

這應該清理樹公平一點。