antlr选通谓词
这是一个后续问题,我用一种简化的方式陈述了我的问题,但无法在那里解决。antlr选通谓词,antlr,predicate,Antlr,Predicate,这是一个后续问题,我用一种简化的方式陈述了我的问题,但无法在那里解决。 我有以下语法,当我删除{true}?=>谓词时,文本不再被识别。输入字符串为modulemain LTLSPEC H{}{}{o}FALSE。请注意,后面的没有标记为EOC,而是标记为IGNORE。当我将{true}?=>添加到EOC规则时标记为EOC。 我使用antlr-v3.3和v3.4从命令行尝试了这一点,没有任何区别。提前谢谢,我感谢你的帮助 grammar NusmvInput; options { lang
我有以下语法,当我删除
{true}?=>
谓词时,文本不再被识别。输入字符串为modulemain LTLSPEC H{}{}{o}FALSE代码>。请注意,后面的代码>没有标记为EOC,而是标记为IGNORE。当我将{true}?=>
添加到EOC规则时代码>标记为EOC。
我使用antlr-v3.3和v3.4从命令行尝试了这一点,没有任何区别。提前谢谢,我感谢你的帮助
grammar NusmvInput;
options {
language = Java;
}
@parser::members{
public static void main(String[] args) throws Exception {
NusmvInputLexer lexer = new NusmvInputLexer(new ANTLRStringStream("MODULE main LTLSPEC H {} {} {o} FALSE;"));
NusmvInputParser parser = new NusmvInputParser(new CommonTokenStream(lexer));
parser.specification();
}
}
@lexer::members{
private boolean inLTL = false;
}
specification :
module+ EOF
;
module :
MODULE module_decl
;
module_decl :
NAME parameter_list ;
parameter_list
: ( LP (parameter ( COMMA parameter )*)? RP )?
;
parameter
: (NAME | INTEGER )
;
/**************
*** LEXER
**************/
COMMA
:{!inLTL}?=> ','
;
OTHER
: {!inLTL}?=>( '&' | '|' | 'xor' | 'xnor' | '=' | '!' |
'<' | '>' | '-' | '+' | '*' | '/' |
'mod' | '[' | ']' | '?')
;
RCP
: {!inLTL}?=>'}'
;
LCP
: {!inLTL}?=>'{'
;
LP
: {!inLTL}?=>'('
;
RP
: {!inLTL}?=>')'
;
MODULE
: {true}?=> 'MODULE' {inLTL = false;}
;
LTLSPEC
: {true}?=> 'LTLSPEC'
{inLTL = true; skip(); }
;
EOC
: ';'
{
if (inLTL){
inLTL = false;
skip();
}
}
;
WS
: (' ' | '\t' | '\n' | '\r')+ {$channel = HIDDEN;}
;
COMMENT
: '--' .* ('\n' | '\r') {$channel = HIDDEN;}
;
INTEGER
: {!inLTL}?=> ('0'..'9')+
;
NAME
:{!inLTL}?=> ('A'..'Z' | 'a'..'z') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$' | '#' | '-')*
;
IGNORE
: {inLTL}?=> . {skip();}
;
语法输入;
选择权{
语言=Java;
}
@解析器::成员{
公共静态void main(字符串[]args)引发异常{
NusmvInputLexer lexer=新的NusmvInputLexer(新的AntlStringStream(“模块主LTLSPEC H{}{}{o}FALSE;”);
NusmvInputParser parser=新的NusmvInputParser(新的CommonTokenStream(lexer));
parser.specification();
}
}
@lexer::成员{
私有布尔inLTL=false;
}
规范:
模块+EOF
;
模块:
模块decl
;
模块名称:
名称参数列表;
参数列表
:(LP(参数(逗号参数)*)?RP?
;
参数
:(名称|整数)
;
/**************
***雷克瑟
**************/
逗号
:{!inLTL}?=>,'
;
其他
:{!inLTL}?=>('&'|'|'|'|'异或'|'xnor'|'='|'!'|
'' | '-' | '+' | '*' | '/' |
“mod'|'['|']'|'?')
;
RCP
:{!inLTL}?=>'}'
;
LCP
:{!inLTL}?=>“{”
;
LP
:{!inLTL}?=>'('
;
反相
:{!inLTL}?=>')”
;
模块
:{true}?=>'模块'{inLTL=false;}
;
LTLSPEC
:{true}?=>“LTLSPEC”
{inLTL=true;skip();}
;
平等机会委员会
: ';'
{
如果(inLTL){
inLTL=假;
跳过();
}
}
;
WS
:(“”|’\t’|’\n’|’\r’+{$channel=HIDDEN;}
;
评论
:'--'.*('\n'|'\r'){$channel=HIDDEN;}
;
整数
:{!inLTL}?=>('0'..'9')+
;
名称
:{!inLTL}?=>('A'.'Z'.'A'.'Z')('A'.'Z'.'A'.'A'.'Z'.'0'.'9'.''.'美元'.''.'.'.''.'-'))*
;
忽略
:{inLTL}?=>。{skip();}
;
似乎在模块
和LTLSPEC
之前没有谓词,名称
优先于它们,即使这些标记是在名称
标记之前定义的。这是设计还是错误,我不知道
然而,您试图解决这个问题的方法似乎相当复杂。据我所知,您似乎希望忽略(或跳过)以LTLSPEC
开头并以分号结尾的输入。为什么不改为这样做:
specification : module+ EOF;
module : MODULE module_decl;
module_decl : NAME parameter_list;
parameter_list : (LP (parameter ( COMMA parameter )*)? RP)?;
parameter : (NAME | INTEGER);
MODULE : 'MODULE';
LTLSPEC : 'LTLSPEC' ~';'* ';' {skip();};
COMMA : ',';
OTHER : ( '&' | '|' | 'xor' | 'xnor' | '=' | '!' |
'<' | '>' | '-' | '+' | '*' | '/' |
'mod' | '[' | ']' | '?')
;
RCP : '}';
LCP : '{';
LP : '(';
RP : ')';
EOC : ';';
WS : (' ' | '\t' | '\n' | '\r')+ {$channel = HIDDEN;};
COMMENT : '--' .* ('\n' | '\r') {$channel = HIDDEN;};
INTEGER : ('0'..'9')+;
NAME : ('A'..'Z' | 'a'..'z') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$' | '#' | '-')*;
规格:模块+EOF;
模块:模块decl;
模块名称:名称参数列表;
参数列表:(LP(参数(逗号参数)*)?RP)?;
参数:(名称|整数);
模块:'模块';
LTLSPEC:'LTLSPEC'~';'*';'{skip();};
逗号:',';
其他:(“&”|“|”|“异或”|“xnor”|“=”|“!”|
'' | '-' | '+' | '*' | '/' |
“mod'|'['|']'|'?')
;
RCP:'}';
立法会议员:{};
LP:'(';
RP:')';
平机会:“;”;
WS:(“”|’\t’|’\n’|’\r’+{$channel=HIDDEN;};
注释:'--'.*('\n'|'\r'){$channel=HIDDEN;};
整数:('0'..'9')+;
名称:('A'.'Z'.'A'.'Z')('A'.'Z'.'A'.'Z'.'0'.'9'.'.'.'$'.'.'.''.-')*;
似乎在模块
和LTLSPEC
之前没有谓词,名称
优先于它们,即使这些标记是在名称
标记之前定义的。这是设计还是错误,我不知道
然而,您试图解决这个问题的方法似乎相当复杂。据我所知,您似乎希望忽略(或跳过)以LTLSPEC
开头并以分号结尾的输入。为什么不改为这样做:
specification : module+ EOF;
module : MODULE module_decl;
module_decl : NAME parameter_list;
parameter_list : (LP (parameter ( COMMA parameter )*)? RP)?;
parameter : (NAME | INTEGER);
MODULE : 'MODULE';
LTLSPEC : 'LTLSPEC' ~';'* ';' {skip();};
COMMA : ',';
OTHER : ( '&' | '|' | 'xor' | 'xnor' | '=' | '!' |
'<' | '>' | '-' | '+' | '*' | '/' |
'mod' | '[' | ']' | '?')
;
RCP : '}';
LCP : '{';
LP : '(';
RP : ')';
EOC : ';';
WS : (' ' | '\t' | '\n' | '\r')+ {$channel = HIDDEN;};
COMMENT : '--' .* ('\n' | '\r') {$channel = HIDDEN;};
INTEGER : ('0'..'9')+;
NAME : ('A'..'Z' | 'a'..'z') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$' | '#' | '-')*;
规格:模块+EOF;
模块:模块decl;
模块名称:名称参数列表;
参数列表:(LP(参数(逗号参数)*)?RP)?;
参数:(名称|整数);
模块:'模块';
LTLSPEC:'LTLSPEC'~';'*';'{skip();};
逗号:',';
其他:(“&”|“|”|“异或”|“xnor”|“=”|“!”|
'' | '-' | '+' | '*' | '/' |
“mod'|'['|']'|'?')
;
RCP:'}';
立法会议员:{};
LP:'(';
RP:')';
平机会:“;”;
WS:(“”|’\t’|’\n’|’\r’+{$channel=HIDDEN;};
注释:'--'.*('\n'|'\r'){$channel=HIDDEN;};
整数:('0'..'9')+;
名称:('A'.'Z'.'A'.'Z')('A'.'Z'.'A'.'Z'.'0'.'9'.'.'.'$'.'.'.''.-')*;
只要浏览一下语法,我就已经看到了两个错误:模块中的^
规则,而选项中没有output=AST
,而规范以-
规则结尾(减号)签名。对此表示抱歉。我在将代码复制到stackoverflow后删除了树重写,并忘记了这些。只需浏览一下您的语法,我就已经看到了两个错误:模块
规则中有一个^
,而选项中没有输出=AST
,而规范
规则以一个-
结尾(减号)符号。很抱歉。我在将代码复制到stackoverflow后删除了树重写,并忘记了这些。从本例中您无法看到它,但是LTLSPEC
可以通过;
完成。也可以通过MODULE
或其他LTLSPEC
完成。当我尝试类似(~(MODULE | LTLSPEC))*
奇怪的是它不起作用,但是现在不记得错误了。我想如果我在完成LTLSPEC
-部分人工END
-标记之前添加任何内容,然后:LTLSPEC:'LTLSPEC'~END*我基本上可以接受你的建议{