2010-02-15 6 views
0

У меня есть строки, как это:ANTLR проблема с привязкой

`(val1, val2, val3)` 

И у меня есть ANTLR грамматики, чтобы разобрать этот код:

grammar TEST; 

tokens { 
ORB = '('; 
CRB = ')'; 
COMA = ','; 
} 

@members{ 

} 
/*Parser rule*/ 
mainRule 
    : ORB WORD (COMA WORD)* CRB; 

/*Lexer rule*/ 

WORD : ('a'..'z'|'A'..'Z'|'0'..'9')+; 

WS  : ('\t' | ' ' | '\r' | '\n'| '\u000C')+ { $channel = HIDDEN; }; 

Теперь мне нужно отобразить все WORD S в Java. Как связать значение, когда целевой токен заключен в скобки?

Большое спасибо!

+0

Вы упомянули, что несколько человек дали вам полезные ответы - как насчет голосования по этим вопросам? –

ответ

1

Довольно так же, как ответ JS челкой, только вот полный SSCCE вы можете скомпилировать и запустить, и я показал, как можно „ярлык“ ваши жетоны и доступ к ним, чтобы поместить их в Перечислите mainRule возвращается. Также обратите внимание, что перед init должен стоять знак @ (по крайней мере ANTLR v3 ожидает его).

grammar Test; 

@parser::members { 
    public static void main(String[] args) throws Exception { 
    String text = "(a, bb , ccc)"; 
    ANTLRStringStream in = new ANTLRStringStream(text); 
    TestLexer lexer = new TestLexer(in); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    System.out.println(new TestParser(tokens).mainRule()); 
    } 
} 

mainRule returns [List<String> words] 
@init{$words = new ArrayList<String>();} 
    : '(' w=WORD {$words.add($w.text);} (',' w=WORD {$words.add($w.text);})* ')' 
    ; 

WORD 
    : ('a'..'z'|'A'..'Z'|'0'..'9')+ 
    ; 

WS 
    : ('\t' | ' ' | '\r' | '\n'| '\u000C')+ { $channel = HIDDEN; } 
    ; 

И потом:

[email protected]:~/Temp$ java -cp antlr-3.2.jar org.antlr.Tool Test.g 
[email protected]:~/Temp$ javac -cp antlr-3.2.jar *.java 
[email protected]:~/Temp$ java -cp .:antlr-3.2.jar TestParser 
[a, bb, ccc] 
[email protected]:~/Temp$ 

В Windows выше команды в значительной степени то же самое, только запустить TestParser так:

java -cp .;antlr-3.2.jar TestParser 

(есть точка с запятой вместо регулярная толстая кишка)

+0

Спасибо! Ваш ответ очень полезен для меня! – glebreutov

+0

Добро пожаловать. –

0

Вы можете получить текстовое значение согласованного токена с свойством .text. Как это:

string s = $WORD.text 

В зависимости от того, что ваша общая грамматика должна делать, это может быть уместно добавить $WORD.text строку во внутренний список, передать его в какой-либо другой функции, или превратить его в возвращаемое значение от mainRule. Например, если вы хотите mainRule дать вам обратно список проанализированных строк, вы можете написать следующее:

mainRule returns [List strings] @init { $strings = new Vector(); }: 
    ORB 
    WORD { $strings.add($WORD.text); } 
    (COMMA WORD { $strings.add($WORD.text); })* 
    CRB 
    ; 
+0

Не уверен, что вы забыли '@' перед 'init', или если это ANTLR v2 синтаксис. В ANTLR v3 вы должны поставить перед ним '@'. –

+0

Спасибо! Я не знаю о ключевом слове @init. Ваш ответ очень полезен для меня. P.S.У вас есть некоторые ошибки в вашем примере, это правильный код: mainRule2 возвращает [Строки списка] @init {$ strings = new Vector(); }: ORB val0 = WORD {$ strings.add ($ val0.text); } (COMA val1 = WORD {$ stringings.add ($ val1.text);}) * CRB; – glebreutov

0

К сожалению, не могли бы вы разработать немного о том, что вы пытаетесь сделать? Как я понял, вы хотите привязать каждое слово к переменной java, правильно?

words+=WORD (COMA words+=WORD)* {$words} 

Здесь вы определяете ярлык words (который на самом деле в списке) и добавьте все вхождения WORD на эту метку, используя + = синтаксис. Затем вы можете обратиться к этой этикетке, как показано на рисунке $words

Посмотрите на документацию ANTLR и найдите этикетки. Если вы хотите сделать что-то сложное с вашим парсером, я рекомендую книгу Терренса Парра по ANTLR. Он имеет очень хорошую главу введения в общую тему разбора и является наилучшей ссылкой для ANTLR.

НТН

+0

Спасибо! Это именно то, что я имею в виду! Извините за плохо сформулированный вопрос, английский - это не мой родной язык – glebreutov

+0

Добро пожаловать. Если ответ вам поможет, не забудьте пометить его. Я не думаю, что очки SO-flair торгуются на ebay (пока) ;-) – er4z0r

Смежные вопросы