java 中的 Antlr 3.3 return 值
Antlr 3.3 return values in java
我试图找出如何从解析器获取值。
我的输入是 'play the who' 并且它应该 return 一个带有 'the who'.
的字符串
示例.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;}
;
如果我输入 'play the who' 那棵树出现:
http://i.stack.imgur.com/ET61P.png
我创建了一个 Java 文件来捕获输出。如果我调用 parser.wordExp() 我应该得到 'the who',但它 return 是对象和这个 EOF 失败(见下面的输出)。 parser.text() returns 'play'.
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());
}
}
控制台return这个:
play
a.b.c.SampleParser$wordExp_return@1d0ca25a
line 1:12 no viable alternative at input '<EOF>'
我怎样才能赶上'the who'?我很奇怪为什么我无法捕捉到这个字符串。解释器正确地创建了树。
首先,在您的语法中,speech
仅分配给解析器规则 wordExp
的 return 值。如果您还想操纵规则 name
的 return 值,您可以使用一个附加变量来完成此操作,如下例所示。
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'
就会消失。
可能有更好的方法来执行此操作,但与此同时,这可能会对您有所帮助。
我试图找出如何从解析器获取值。 我的输入是 'play the who' 并且它应该 return 一个带有 'the who'.
的字符串示例.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;}
;
如果我输入 'play the who' 那棵树出现:
http://i.stack.imgur.com/ET61P.png
我创建了一个 Java 文件来捕获输出。如果我调用 parser.wordExp() 我应该得到 'the who',但它 return 是对象和这个 EOF 失败(见下面的输出)。 parser.text() returns 'play'.
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());
}
}
控制台return这个:
play
a.b.c.SampleParser$wordExp_return@1d0ca25a
line 1:12 no viable alternative at input '<EOF>'
我怎样才能赶上'the who'?我很奇怪为什么我无法捕捉到这个字符串。解释器正确地创建了树。
首先,在您的语法中,speech
仅分配给解析器规则 wordExp
的 return 值。如果您还想操纵规则 name
的 return 值,您可以使用一个附加变量来完成此操作,如下例所示。
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'
就会消失。
可能有更好的方法来执行此操作,但与此同时,这可能会对您有所帮助。