如何解析antlr4中的可选岛文本

时间:2014-03-09 14:26:17

标签: antlr4

作为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?);

具有词法规则的不同顺序。尝试了更多词法命令但没有成功。

1 个答案:

答案 0 :(得分:0)

似乎你确实希望将'换行符'作为转义字符,例如';'在大多数编程语言中。因此,NEWLINE必须成为一个规则而不仅仅是一个空格字符。