Грамматика выглядит так:
S->a:=F;
F->F or T|F xor T|T
T->T and E|E
E->(F)|not (F)|a
grammar MyLang;
options {
language = Java;
output = AST;
}
@lexer::header {
package com.bla-bla;
}
@parser::header {
package com.bla-bla;
}
expression : andexpression;
andexpression : orexpression (AND^ orexpression)*;
orexpression : notexpression (OR^ notexpression)*;
notexpression : NOT^ atom | atom;
atom : ID | LPAREN! andexpression RPAREN!;
XOR : 'xor';
OR : 'or';
AND : 'and';
NOT : 'not';
ASSIGN : ':=' ;
LPAREN : '(' ;
RPAREN : ')' ;
SEMI : ';' ;
ID : LETTER ('_'|LETTER | DIGIT)*
;
COMMENT
: '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
| '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
HEXLITERAL : '0' ('x'|'X') HEXDIGIT+;
fragment HEXDIGIT : ('0'..'9'|'A'..'F'|'a'..'f');
fragment DIGIT : '0'..'9';
fragment LETTER: ('a'..'z' | 'A'..'Z');
парсер от лексера ничем не отличается, по сути. просто лексемы - более простые элементы. а парсер работает не с символами, а уже с лексемами.
если тебе нужно дерево, то копай в сторону ANTLR AST (abstract syntax tree):
http://www.antlr.org/wiki/display/ANTLR3/Tree+construction
то есть, он сам умеет эти деревья строить. и потом остаётся их только заюзать. генерится дерево точно так же, из парсера. там пара параметров указывается в заголовках, что нужно на выходе дерево выдать и после создания парсера в программе ещё вызываются команды для создания дерева. это всё есть в документации подробно, я пару раз работала с деревьями, это элементарно, просто мне редко нужно и нет смысла всё это запоминать. на сайте есть отличная документация, с примерами.
по сути, если ты будешь просто выводить найденные элементы при разборе выражения, то ты и получишь дерево. но для удобства можно сразу дерево получить. можно их даже комбинировать, проходя по дереву второй раз с каким-то новым парсером и т.д.
Про генерацию дерева я прочитал.
У меня с правилами проблема. Я туплю.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)