path[Scope sc] returns [Path p]
@init{
List<String> parts = new ArrayList<String>();
}
: ^(PATH (id=IDENT{parts.add($id.text);})+ pathIndex? )
{// ACTION CODE
// need to check if pathIndex has executed before running this code.
if ($pathIndex.index >=0 ){
p = new Path($sc, parts, $pathIndex.index);
}else if($pathIndex.pathKey != ""){
p = new Path($sc, parts, $pathIndex.pathKey);
}
;
有没有办法检测是否执行了pathIndex?在我的动作代码中,我尝试测试$ pathIndex == null,但ANTLR不允许你这样做。 ANTLRWorks提供语法错误,其中显示“缺少对规则范围的属性访问:pathIndex。”
我之所以需要这样做是因为在我的动作代码中我做了:
$pathIndex.index
如果变量$ pathIndex被转换为null,则返回0。当您访问属性时,ANTLR会生成pathIndex7!=null?pathIndex7.index:0
这会导致对象出现问题,因为它将我预设的值更改为-1,将错误标志更改为0。
答案 0 :(得分:4)
有几种选择:
将您的代码放在可选的pathIndex:
中rule
: ^(PATH (id=IDENT{parts.add($id.text);})+ (pathIndex {/*pathIndex cannot be null here!*/} )? )
;
使用布尔标志表示pathIndex
的存在(或不存在):
rule
@init{boolean flag = false;}
: ^(PATH (id=IDENT{parts.add($id.text);})+ (pathIndex {flag = true;} )? )
{
if(flag) {
// ...
}
}
;
您还可以pathIndex
匹配任何内容,以便您不需要在path
内将其设为可选:
path[Scope sc] returns [Path p]
: ^(PATH (id=IDENT{parts.add($id.text);})+ pathIndex)
{
// code
}
;
pathIndex returns [int index, String pathKey]
@init {
$index = -1;
$pathKey = "";
}
: ( /* some rules here */ )?
;
PS。意识到表达式$pathIndex.pathKey != ""
最有可能评估为false
。要比较Java中字符串的内容,请改用equals(...)
方法:
!$pathIndex.pathKey.equals("")
或如果$pathIndex.pathKey
可以是null
,您可以通过以下方式规避NPE:
!"".equals($pathIndex.pathKey)
答案 1 :(得分:0)
更多信息会有所帮助。但是,如果我理解正确,当您想要测试$pathIndex.index == null
的输入中没有索引的值时。此代码使用pathIndex规则将Integer $ index返回到路径规则:
path
: ^(PATH IDENT+ pathIndex?)
{ if ($pathIndex.index == null)
System.out.println("path index is null");
else
System.out.println("path index = " + $pathIndex.index); }
;
pathIndex returns [Integer index]
: DIGIT
{ $index = Integer.parseInt($DIGIT.getText()); }
;
为了测试,我创建了这些简单的解析器和词法分析器规则:
path : 'path' IDENT+ pathIndex? -> ^(PATH IDENT+ pathIndex?)
;
pathIndex : DIGIT
;
/** lexer rules **/
DIGIT : '0'..'9' ;
IDENT : LETTER+ ;
fragment LETTER : ('a'..'z' | 'A'..'Z') ;
当输入中存在索引时,如path a b c 5
中所示,输出为:
Tree = (PATH a b c 5)
path index = 5
当输入中没有索引时,如path a b c
中所示,输出为:
Tree = (PATH a b c)
path index is null