【问题标题】:Antlr 3.3 return values in javaAntlr 3.3 在 java 中的返回值
【发布时间】:2015-03-03 04:54:54
【问题描述】:

我试图弄清楚如何从解析器中获取值。 我的输入是“扮演谁”,它应该返回一个带有“谁”的字符串。

示例.g:

text returns [String value]
 : speech = wordExp space name {$value = $speech.text;}
 ;

name returns [String value] 
 : SongArtist = WORD (space WORD)*  {$value = $SongArtist.text;}
 ;

wordExp returns [String value] 
 : command = PLAY {$value = $command.text;} | command = SEARCH {$value = $command.text;}
 ; 

PLAY   : 'play';
SEARCH : 'search';
space : ' ';

WORD : ( 'a'..'z' | 'A'..'Z' )*; 


WS  
 : ('\t' | '\r'| '\n') {$channel=HIDDEN;}
 ;

如果我输入“扮演谁”,那棵树就会出现:

http://i.stack.imgur.com/ET61P.png

我创建了一个 Java 文件来捕获输出。如果我调用 parser.wordExp() 我应该得到“谁”,但它返回对象和这个 EOF 失败(见下面的输出)。 parser.text() 返回“播放”。

import org.antlr.runtime.*;

import a.b.c.SampleLexer;
import a.b.c.SampleParser;

public class Main {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("play the who");

        SampleLexer lexer = new SampleLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        SampleParser parser = new SampleParser(tokens);

        System.out.println(parser.text());
        System.out.println(parser.wordExp());
    }
}

控制台返回这个:

play
a.b.c.SampleParser$wordExp_return@1d0ca25a
line 1:12 no viable alternative at input '<EOF>'

我怎样才能抓住“谁”?对我来说很奇怪为什么我不能抓住这个字符串。解释器正确地创建了树。

【问题讨论】:

    标签: java parsing text antlr


    【解决方案1】:

    首先,在您的语法中,speech 仅被分配解析器规则 wordExp 的返回值。如果您还想操作规则 name 的返回值,您可以使用附加变量来执行此操作,如下例所示。

    text returns [String value]
     : a=wordExp space b=name {$value = $a.text+" "+$b.text;}
     ;
    

    其次,调用parser.text() 解析整个输入。因此,第二次调用(在您的情况下为 parser.wordExp())会找到 EOF。如果您删除第二个电话,no viable alternative at input 'EOF' 就会消失。

    可能有更好的方法来做到这一点,但同时这可能会对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2012-10-26
      • 2010-10-20
      • 1970-01-01
      • 2016-11-27
      相关资源
      最近更新 更多