gpt4 book ai didi

java - Antlr 3.3 java中的返回值

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:21 26 4
gpt4 key购买 nike

我尝试弄清楚如何从解析器获取值。我的输入是“play the who”,它应该返回一个带有“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;}
;

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

/image/ET61P.png

我创建了一个 Java 文件来捕获输出。如果我调用 parser.wordExp() 我应该得到“the who”,但它返回对象和 EOF 失败(请参见下面的输出)。 parser.text() 返回“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());
}
}

控制台返回:

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

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

最佳答案

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

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

其次,调用 parser.text() 解析整个输入。第二次调用(在您的情况下是 parser.wordExp())因此找到 EOF。如果删除第二个调用,在输入“EOF”处没有可行的替代方案就会消失。

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

关于java - Antlr 3.3 java中的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28824368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com