ANTLR绑定问题

时间:2010-02-15 17:27:40

标签: java antlr

我有这样的字符串:

`(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。当目标令牌包含在括号中时,如何绑定值?

非常感谢!

3 个答案:

答案 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