Грамматика ANTLR не отслеживается при анализе похожих правил - PullRequest
1 голос
/ 15 февраля 2012

Предположим, у меня есть грамматика, которая заботится о глобальных переменных, и некоторые объявления методов некоторого варианта C

program: (declaration)* (procedure)*;
declaration: typespec identifier ';';
procedure: typespec identifier '(' ')' ';';
typespec: 'char' | 'int';
identifier: ('a' .. 'z' | 'A' .. 'Z') ('A' - 'Z' | 'a' .. 'z' | '0' .. '9' | '_')*;

Если я кормлю что-то вроде:

int MAX;
char proc();

грамматика читает int MAX; правильно, но затем он хочет применить правило объявления также ко 2-й строке, и он не работает, когда достигает (и в этот момент я ожидаю, что он откатится назад и применит следующее правило, которое относится к процедуре. Может кто-нибудь сказать мне почему этого не происходит?

1 Ответ

1 голос
/ 15 февраля 2012

Вы опубликовали всю свою грамматику? Я не смог заставить его скомпилировать, как вы написали ... но я поиграл с тем, что вы опубликовали, чтобы он соответствовал вашему примеру:

program: (declaration)* (procedure)*;
statement: TYPE_SPEC IDENT ;
declaration: statement ';';
procedure: statement '(' ')' ';';

TYPE_SPEC 
    :   'char' | 'int';

IDENT 
    :   ('a' .. 'z' | 'A' .. 'Z') ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' | '_')*;

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

Я бы порекомендовал вам использовать правила make lexer (прописные) для соответствия токенов, а не включать их в правила вашего синтаксического анализатора - некоторые из них я уже сделал для вас, как вы можете видеть.

...