Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带绑定的ANTLR问题_Java_Antlr - Fatal编程技术网

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;谢谢这正是我的意思!对不起,我的问题表达得很糟糕,英语不是我的母语,不客气。如果答案对你有帮助,别忘了标记。我不这么认为,天赋点数在易趣上交易(目前);-)谢谢你的回答对我很有用!你提到有几个人给了你有用的答案--投票表决这些问题怎么样?