作为tiny language example problems的延续,我想问一下如何解析以下文字。这次只是想跳过尾巴规则,但它是一个岛屿,对我来说并不明显。最好的,不那么hackish的方法?
a : sss
a : eeee:yyyy
a :
a : tttt:aaa
使用以下使用词法模式的语法:
SimpleL.g4
lexer grammar SimpleL;
fragment WS : [ \t\r\n]+;
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?);
具有词法规则的不同顺序。尝试了更多词法命令但没有成功。
答案 0 :(得分:0)
似乎你确实希望将'换行符'作为转义字符,例如';'在大多数编程语言中。因此,NEWLINE必须成为一个规则而不仅仅是一个空格字符。