我仍然在ANTLR的学习路径上。我已经构建了一个语法,并且在很大程度上它完成了我的期望,但我需要它能够以静默方式运行(没有输出到stdout或stderr)。
grammar MyPredicate;
options
{
output=AST;
}
parse : expression EOF
;
expression
: field WS? OPERATOR_BINARY WS? value
;
OPERATOR_BINARY
: '=' | '<' | '>' | '<=' | '>=' | '!=' | 'has'
;
value : VALUE_STRING
| VALUE_NUMERIC
| VALUE_BOOLEAN
;
VALUE_STRING
: '""'
| '"' (ESC_SEQ | ~('\\'|'"'))+ '"'
;
VALUE_NUMERIC
: ('0'..'9')+ ('.' ('0'..'9')+)?
;
VALUE_BOOLEAN
: 'true'
| 'false'
;
field : FIELD_NAME
;
FIELD_NAME
: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
ESC_SEQ
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
;
WS : (' ' | '\t' | '\r' | '\n') {skip();}
;
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;
public class Main {
public static void main(String[] args) throws Exception {
MyPredicateParser parser = new MyPredicateParser(new CommonTokenStream(new MyPredicateLexer(new ANTLRStringStream(args[0]))));
MyPredicateParser.parse_return r = parser.parse();
parser.parse();
if ( r.tree!=null ) {
System.out.println(((Tree)r.tree).toStringTree());
((CommonTree)r.tree).sanityCheckParentAndChildIndexes();
}
}
}
a = 1
line 0:-1 mismatched input '<EOF>' expecting FIELD_NAME
a = 1 null
我不确定为什么会收到EOF错误。从我的理解我的语法正确解析,并在评估“解析”解析器后得到错误,但该节点正在寻找EOF。使用ANTLR 3.2
答案 0 :(得分:13)
问题是您在Main类中调用parse()
两次。删除行:
parser.parse();
只留下:
MyPredicateParser.parse_return r = parser.parse();
到位。