Java 带绑定的ANTLR问题
我有这样的字符串:Java 带绑定的ANTLR问题,java,antlr,Java,Antlr,我有这样的字符串: `(val1, val2, val3)` java -cp .;antlr-3.2.jar TestParser 我有ANTLR语法来解析这段代码: grammar TEST; tokens { ORB = '('; CRB = ')'; COMA = ','; } @members{ } /*Parser rule*/ mainRule : ORB WORD (COMA WORD)* CRB; /*Lexer rule*/ WORD
`(val1, val2, val3)`
java -cp .;antlr-3.2.jar TestParser
我有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
s映射到Java中。当目标标记包含在括号中时,如何绑定值
非常感谢 您可以使用
.text
属性获取匹配令牌的文本值。像这样:
string s = $WORD.text
根据您的整体语法应该做什么,可以将$WORD.text
字符串添加到内部列表中,将其传递给其他函数,或者将其转换为mainRule
的返回值。例如,如果希望mainRule
返回已解析字符串的列表,可以编写以下代码:
mainRule returns [List strings] @init { $strings = new Vector(); }:
ORB
WORD { $strings.add($WORD.text); }
( COMMA WORD { $strings.add($WORD.text); } )*
CRB
;
对不起,你能详细说明一下你想做什么吗? 我明白了,您希望将每个单词绑定到一个java变量,对吗
words+=WORD (COMA words+=WORD)* {$words}
这里定义一个标签words
(实际上是一个列表),并使用+=语法将WORD
的每次出现添加到该标签中。然后,您可以参考此标签,如图所示$words
查看ANTLR文档并查找标签。
如果你想用你的解析器做一些复杂的事情,我推荐Terrence Parr关于ANTLR的书。它有一章很好地介绍了解析的一般主题,是ANTLR的最佳参考
HTH与JS Bangs的答案几乎相同,这里只有一个完整的代码,您可以编译和运行,我展示了如何“标记”您的令牌并访问它们,将它们放入mainRule返回的列表中。还请注意,
init
前面需要一个@
符号(至少ANTLR v3需要它)
在Windows上,上述命令基本相同,只需按如下方式运行TestParser
:
`(val1, val2, val3)`
java -cp .;antlr-3.2.jar TestParser
(有一个分号而不是普通的冒号)不确定您是否忘记了
@
在init
之前,或者它是否是ANTLR v2语法。在ANTLR v3中,您应该在其前面放置一个@
。谢谢!我不知道@init关键字。你的回答对我很有帮助。另外,您的示例中有一些错误,这是正确的代码:mainRule2返回[List strings]@init{$strings=new Vector();}:ORB val0=WORD{$strings.add($val0.text);}(COMA val1=WORD{$strings.add($val1.text);}*CRB;谢谢这正是我的意思!对不起,我的问题表达得很糟糕,英语不是我的母语,不客气。如果答案对你有帮助,别忘了标记。我不这么认为,天赋点数在易趣上交易(目前);-)谢谢你的回答对我很有用!你提到有几个人给了你有用的答案--投票表决这些问题怎么样?