作为我的小语言示例问题的延续,我想询问如何解析以下文本。这次只想跳过尾巴规则,但这是一个岛屿,对我来说并不明显。最好的,不太黑的方法?
a : sss
a : eeee:yyyy
a :
a : tttt:aaa
使用以下语法使用词汇模式:
simplel.g4
lexer grammar SimpleL;
fragment WS : [ trn]+;
SEMI : ':' -> pushMode(TMODE);
HEAD : 'a' ;
WS_DEFAULT: WS -> skip;
mode TMODE;
TAIL : [a-z:]+ -> popMode;
WS_TMODE : WS -> skip;
simple.g4
parser grammar Simple;
options {
tokenVocab = SimpleL;
}
prog : entry+ EOF;
entry : head semi tail;
semi : SEMI;
tail : TAIL;
head : HEAD;
目的是捕获尾部规则不存在的情况。但是,如果所有白色空间都被跳过,则下一节 a:tttt:aaa 变成尾巴,我无法区分情况。目标情况是有以下内容:
(prog (entry (head a) (semi :) (tail sss))
(entry (head a) (semi :) (tail eeee:yyyy))
(entry (head a) (semi :) (tail )
(entry (head a) (semi :) (tail tttt:aaa)
) <EOF>)
我尝试的是解析器中的规则:
entry : (head semi head semi tail | head semi tail);
和
entry : (head semi tail?);
通过Lexer规则的不同顺序。也尝试了更多词汇命令,没有成功。
似乎您确实想将'newline'作为逃脱字符,例如';''在大多数编程语言中。因此,Newline不仅必须成为规则,而不仅要成为一个空间特征。