Я начинаю с ANTLR и пытаюсь создать парсер для очень простого языка. В настоящее время моя грамматика определяется как:
/*
* Parser Rules
*/
public compileUnit
: DEFINE IDENTIFIER END_OF_STATEMENT { Console.WriteLine($IDENTIFIER.text); };
/*
* Lexer Rules
*/
DEFINE : 'define';
// Basic tokens
INT : '0'..'9'+;
END_OF_STATEMENT : ';';
// Whitespace
WS : (' '|'\t'|'\r'|'\n')+ {Skip();} ;
// Sub-statement tokens
IDENTIFIER : ('a'..'z' | 'A'..'Z')+ (INT | ('a'..'z' | 'A'..'Z') | '_')*;
Язык - CSharp3
.
Когда я пытаюсь ввести следующее, он работает правильно, печатая имя идентификатора:
define My_Identifier1;
Однако ввод garbage
также вызывает распечатку garbage
, как если бы это был идентификатор.
Почему compileUnit
не генерирует исключение? Может ли это быть проблемой с порядком, в котором определены правила грамматики?
('a'..'z' | 'A'..'Z') (INT | 'a'..'z' | 'A'..'Z' | '_')*
. - person greenoldman   schedule 17.11.2013DEFINE
терминалом. Вы знаете, как простая отладка. Просто убедитесь, что вы напечатали$DEFINE.text # $IDENTIFIER.text
(подойдет любой разделитель, кроме пробела), чтобы убедиться, что вы знаете, какая часть какая. - person greenoldman   schedule 17.11.2013