2017-08-01 75 views
0

我很確定這是不可能的,但我想問一下以防萬一。ANTLR識別單個字符

我有共同的ID令牌定義:

ID: LETTER (LETTER | DIG)*; 

的問題是,在語法我需要解析,也有你有一個單一的字符作爲操作數,像一些說明:

a + 4 

ab + 4 

是不可能的。

所以我不能寫這樣一個規則:

sum: (INT | LETTER) ('+' (INT | LETTER))* 

因爲詞法分析器會考慮「一」作爲ID,由於ID的優先級越高。 (我不能改變這個優先級,因爲它不會識別單個字符ID)

所以我只能在該規則中使用ID而不是LETTER。這很醜陋,因爲不應該有一個ID,只有一個字母,我將不得不做第二個語法分析來檢查。

我知道這件事沒有任何關係,因爲詞法分析器不瞭解上下文。我在想,也許已經內置ANTLR4是檢查規則內令牌長度的一種方法。喜歡的東西:

sum: (INT | ID{length=1})... 

我也想知道是否有某種「象徵性的別名」,這樣我就可以這樣做:

SINGLE_CHAR is alias of => ID 

爲了避免在規則寫作「ID」,因爲這可能會讓人困惑。

PD:我沒有解析這樣一個簡單的語言,這只是一個小例子。實際上,一個ID也可以是一個字符串,還有其他的標記只能是字母的一個子集等等。所以我認爲在解析這個條目以檢查語法上是合法的之後,我必須進行第二次分析。我只是好奇,如果這樣的事情存在。

+0

爲什麼不給我們展示整個語法?這感覺就像[XY問題](http://mywiki.wooledge.org/XyProblem),我寧願幫你解決真正的問題。 – TomServo

回答

2

檢查標識符的大小是一個語義問題,因此應該在語義階段處理,通常在解析步驟之後進行處理。使用通常的ID規則解析輸入,並在構造的分析樹中檢查識別的ID的大小(並據此採取行動)。不要試圖強迫這種決定進入你的語法。