2015-08-24 32 views
0

我想解析句子"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 
    } 
} 

回答

1

你可以在你的語法一個@header塊,將其添加到生成的解析器文件。

grammar Job; 

@header { 
    import java.util.HashMap; 
} 

就像你正在使用String您可以進一步在你的語法文件使用HashMap類。

還有@members塊來定義解析器的專用字段。您可以使用這兩個塊來檢查示例以在this tutorial中定義表達式求值程序。