我想學習一點ANTLR4並定義一些4GL語言的語法。ParserRule匹配錯誤的標記
這是我有:
compileUnit
:
typedeclaration EOF
;
typedeclaration
:
ID LPAREN DATATYPE INT RPAREN
;
DATATYPE
:
DATATYPE_ALPHANUMERIC
| DATATYPE_NUMERIC
;
DATATYPE_ALPHANUMERIC
:
'A'
;
DATATYPE_NUMERIC
:
'N'
;
fragment
DIGIT
:
[0-9]
;
fragment
LETTER
:
[a-zA-Z]
;
INT
:
DIGIT+
;
ID
:
LETTER
(
LETTER
| DIGIT
)*
;
LPAREN
:
'('
;
RPAREN
:
')'
;
WS
:
[ \t\f]+ -> skip
;
我希望能夠解析什麼:
TEST(A10)
我得到什麼:
typedeclaration:1:6:不匹配輸入'A10'期待DATATYPE
不過,我能寫:
測試(10)
爲什麼我需要把空白會在這裏? LPAREN DATATYPE本身正在工作,所以不需要在兩者之間留出空間。 INT RPAREN也在工作。 爲什麼DATATYPE和INT之間需要一個空間?我對這個有點困惑。 我想它是匹配ID,因爲它是「最長」的匹配,但是必須有某種方法來強迫這裏變得更懶,對嗎?
因爲'A10'是ID的有效標記。你想匹配第一個變體還是兩個? ANTLR總是儘可能匹配令牌(在解析之前創建令牌)。 – CoronA
@CoronA我想匹配第一個變體,沒有空間。 –
我可以想到以下解決方案:明確地包含空白(而不是跳過),使ID不以「A」或「N」開頭或接受括號內的任何ID,並在語義分析中過濾掉錯誤的ID。有偏好嗎? – CoronA