crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> ANTLR. Правила для парсера., Упёрся.
smartchecker
  опции профиля:
сообщение 21.12.2012, 15:14
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

Спасибо сказали: 0 раз(а)




Репутация:   0  


Грамматика выглядит так:
S->a:=F;
F->F or T|F xor T|T
T->T and E|E
E->(F)|not (F)|a

Допустимые лексемы языка - Идентификаторы и hex-числа.

Не могу сочинить правила для парсера.

Правила для лексера.

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');

Конечная задача - сделать дерево вывода.

Сообщение отредактировал smartchecker - 21.12.2012, 15:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.12.2012, 16:09
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


парсер от лексера ничем не отличается, по сути. просто лексемы - более простые элементы. а парсер работает не с символами, а уже с лексемами.

если тебе нужно дерево, то копай в сторону ANTLR AST (abstract syntax tree):
http://www.antlr.org/wiki/display/ANTLR3/Tree+construction

то есть, он сам умеет эти деревья строить. и потом остаётся их только заюзать. генерится дерево точно так же, из парсера. там пара параметров указывается в заголовках, что нужно на выходе дерево выдать и после создания парсера в программе ещё вызываются команды для создания дерева. это всё есть в документации подробно, я пару раз работала с деревьями, это элементарно, просто мне редко нужно и нет смысла всё это запоминать. на сайте есть отличная документация, с примерами.
по сути, если ты будешь просто выводить найденные элементы при разборе выражения, то ты и получишь дерево. но для удобства можно сразу дерево получить. можно их даже комбинировать, проходя по дереву второй раз с каким-то новым парсером и т.д.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 24.12.2012, 12:04
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

Спасибо сказали: 0 раз(а)




Репутация:   0  


Про генерацию дерева я прочитал.
У меня с правилами проблема. Я туплю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 23:12