antlr返回值作为键值

问题描述:

我想解析句子"i am looking for a java developer from india"。 我需要的输出是language = java和place = indiaantlr返回值作为键值

我创建了如下的语法文件。

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中的完全匹配输出?是否有可能得到jsonhashMap的输出为antlr

java类测试的语法如下:

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; 
} 

就像你正在使用String您可以进一步在你的语法文件使用HashMap类。

还有@members块来定义解析器的专用字段。您可以使用这两个块来检查示例以在this tutorial中定义表达式求值程序。