antlr return 值作为键值

antlr return values as key-value

我想解析句子"i am looking for a java developer from india"。 我需要的输出是 language=java 和 place=india

我创建了一个语法文件如下。

grammar Job;

eval returns [String value]
    :    output=jobExp {System.out.println($output.text); $value = $output.text;}
    ;


jobExp returns [String value]
    :    ind=indro whitespace var1=language ' developer from ' var2=place 
                            {
                            System.out.println($var1.text);
                            System.out.println($var2.text);
                            $value = $var1.text+$var2.text; }
    ;

indro
    :
    'i am looking for a'
    |
    'i am searching for a'
    ;

language :
    'java' | 'python' | 'cpp'
    ;

place :
    'india' | 'america' | 'africa'
    ;

whitespace :
    (' '|'\t')+
    ;

jobExp 中,我得到了 placelanguage 的值。我只是返回这两个变量。但是在 eval 中我得到了整个句子(我正在寻找来自印度的 java 开发人员)。我需要什么才能在 eval 中获得完全匹配的输出?是否可以在 antlr 中获得 jsonhashMap 的输出?

我的javaclass用于测试语法如下:

import org.antlr.runtime.*;

public class JobTest {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("i am looking for a java developer from india" );
        JobLexer lexer = new JobLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        JobParser parser = new JobParser(tokens);
        System.out.println(parser.eval()); // print the value
    }
}

您可以在语法中加入 @header 块,将其添加到生成的解析器文件中。

grammar Job;

@header {
    import java.util.HashMap;
}

您可以在语法文件上进一步使用 HashMap class 就像您使用 String.

还有 @members 块来定义解析器的私有字段。您可以检查使用两个块的示例以在 this tutorial.

中定义表达式计算器