我试图使用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。
答案 0 :(得分:0)
解析器无法更改词法分析器的操作。虽然解析器启动了,但是在解析器开始评估解析器规则之前,词法分析器将处理整个输入流。
您可能正在寻找词霸'模式',又名lexical modes。