解析时对词法分析器进行更改

时间:2014-05-08 20:10:54

标签: antlr antlr4

我试图使用ANTLR4解析N3;

在伪ANTLR中:

{plain_is = plain_of = false}

document : (keywords | triple)* ;
keywords : '@keywords' NCNAME (',' NCNAME)* '.'
  {plain_is = 'is' in ncnames
   plain_of = 'of' in ncnames} ;
triple : value predicate value '.' ;
predicate : value | KW_IS value KW_OF ;
value : QNAME | NCNAME ;
QNAME : [a-z]* ':' [a-z]+
NCNAME : [a-z]+ ;
KW_IS : {plain_is}? 'is' | {!plain_is}? '@is' ;
KW_OF : {plain_of}? 'of' | {!plain_of}? '@of' ;
WS : [ \t\r\n]+ -> skip ;

暂时忽略@keywords语义,这是一个有效的文档:

:x :y :z.
:z is :y of :z.

但如果使用@keywords,则列表中未指定的所有关键字都必须以@为前缀,允许将其用作NCNAME s:

@keywords is.
:z is :y @of of.

有没有办法在ANTLR中描述这个?即在解析keywords制作后,将一些标志(如plain_is)传递给词法分析器?

目前,我使用宽松语法并在解析后进行检查,将未列出的关键字转换回NCNAME s。

1 个答案:

答案 0 :(得分:0)

解析器无法更改词法分析器的操作。虽然解析器启动了,但是在解析器开始评估解析器规则之前,词法分析器将处理整个输入流。

您可能正在寻找词霸'模式',又名lexical modes