2015-08-24 8 views
0

Я хочу разобрать предложение "i am looking for a java developer from india". Выход, который мне нужен, это язык = 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 я получаю значение для place и language. И я просто возвращаю только эти две переменные. Но в eval я получаю все предложение (я ищу разработчика Java из Индии). Что мне нужно, чтобы получить точный соответствующий результат в eval? Можно ли получить выход как json или hashMap в 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; 
} 

Вы можете далее файл грамматики использовать HashMap класс так же, как вы используете String.

Существует также блок @members, чтобы определить частные поля анализатора. Вы можете проверить пример, используя оба блока, чтобы определить оценщик выражения в this tutorial.