簡體   English   中英

antlr4 類似的令牌定義

[英]antlr4 Similar token definition

我對令牌定義有疑問。

這是我的語法。

r: PROPNAME ':' PROPVALUE
PROPNAME: [a-zA-Z]+
PROPVALUE: [a-zA-Z0-9]+ 

如果我使用

名稱:christof123 它匹配

如果我使用

名稱:christof 不匹配

當 PROPVALUE 等待時,爭論 'christof' 是 PROPNAME 詞法分析器,因為 'christof' 匹配 PROPVALUE 和 PROPNAME 表達式。

但我不想匹配

name123:克里斯托夫

任何的想法?

就像你說的那樣,詞法分析器將 christof 與 PROPNAME 匹配,因為它首先出現在你的定義中,匹配最長的。 您可以使用grun檢查匹配grun

antlr4 MyGrammer.g4
javac -g *.java
grun MyGrammer r -tokens
# enter your input string and press ctlr+d

您的語法會產生以下匹配項,從而導致錯誤。

name:christof
line 1:13 token recognition error at: '\n'
[@0,0:3='name',<2>,1:0]
[@1,4:4=':',<1>,1:4]
[@2,5:12='christof',<2>,1:5]
[@3,14:13='<EOF>',<-1>,2:0]
line 1:5 mismatched input 'christof' expecting PROPVALUE

因此,將您的語法修改為以下內容即可解決。

r: name ':' value;

name: ALPHA;
value: ALPHA | ALPHANUM;

ALPHA: [a-zA-Z]+;
ALPHANUM: [a-zA-Z0-9]+;

這與 grun 產生以下匹配。

name:christof
line 1:13 token recognition error at: '\n'
[@0,0:3='name',<2>,1:0]
[@1,4:4=':',<1>,1:4]
[@2,5:12='christof',<2>,1:5]
[@3,14:13='<EOF>',<-1>,2:0]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM