我有这样的字符串:
`(val1, val2, val3)`
我有ANTLR语法来解析这段代码:
grammar TEST;
tokens {
ORB = '(';
CRB = ')';
COMA = ',';
}
@members{
}
/*Parser rule*/
mainRule
: ORB WORD (COMA WORD)* CRB;
/*Lexer rule*/
WORD : ('a'..'z'|'A'..'Z'|'0'..'9')+;
WS : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; };
现在我需要将所有WORD
映射到Java。当目标令牌包含在括号中时,如何绑定值?
非常感谢!
答案 0 :(得分:1)
与JS Bangs的回答几乎相同,只有这里有一个完整的SSCCE你可以编译和运行我展示了如何“标记”你的标记并访问它们以将它们放入列表中mainRule是返回。另请注意,init
前面需要一个@
符号(至少ANTLR v3需要它)。
grammar Test;
@parser::members {
public static void main(String[] args) throws Exception {
String text = "(a, bb , ccc )";
ANTLRStringStream in = new ANTLRStringStream(text);
TestLexer lexer = new TestLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
System.out.println(new TestParser(tokens).mainRule());
}
}
mainRule returns [List<String> words]
@init{$words = new ArrayList<String>();}
: '(' w=WORD {$words.add($w.text);} (',' w=WORD {$words.add($w.text);} )* ')'
;
WORD
: ('a'..'z'|'A'..'Z'|'0'..'9')+
;
WS
: ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; }
;
然后:
bart@hades:~/Temp$ java -cp antlr-3.2.jar org.antlr.Tool Test.g
bart@hades:~/Temp$ javac -cp antlr-3.2.jar *.java
bart@hades:~/Temp$ java -cp .:antlr-3.2.jar TestParser
[a, bb, ccc]
bart@hades:~/Temp$
在Windows上,上面的命令几乎相同,只运行你的TestParser
:
java -cp .;antlr-3.2.jar TestParser
(有一个分号而不是普通的冒号)
答案 1 :(得分:0)
您可以使用.text
属性获取匹配令牌的文本值。像这样:
string s = $WORD.text
根据您的整体语法应该做什么,将$WORD.text
字符串添加到内部列表,将其传递给其他函数或将其转换为{{的返回值可能是合适的。 1}}。例如,如果您希望mainRule
返回已解析字符串的列表,则可以编写以下内容:
mainRule
答案 2 :(得分:0)
对不起,你能详细说明你想做什么吗? 我得到它你想要将每个单词绑定到一个java变量,对吗?
words+=WORD (COMA words+=WORD)* {$words}
在此定义标签words
(实际上是一个列表),并使用+ =语法将WORD
的每个出现添加到该标签。然后,您可以参考此标签,如$words
查看ANTLR文档并查找标签。 如果你想用你的解析器做一些复杂的事情我推荐Terrence Parr关于ANTLR的书。它对解析的一般主题有一个非常好的介绍性章节,是ANTLR的最佳参考。
HTH