2010-02-04 2 views
0

У меня есть очень простая ANTLR-грамматика, которую я пытаюсь получить, но в настоящее время терпит неудачу. Будет действительно оценить некоторые указатели на это ...ANTLR - базовая грамматика, включая неожиданные персонажи?

root : (keyword|ignore)*; 
keyword : KEYWORD; 
ignore : IGNORE; 

KEYWORD : ABBRV|WORD; 

fragment WORD : ALPHA+; 
fragment ALPHA : 'a'..'z'|'A'..'Z'; 
fragment ABBRV : WORD?('.'WORD); 

IGNORE : .{ Skip(); }; 

Со следующим входом тест:

"some ASP.NET and .NET stuff. that work." 

Я хотел дерево, которое просто список узлов ключевых слов,

"some", "ASP.NET", "and", ".NET", "stuff", "that", "work" 

на данный момент я получаю

"some", "ASP.NET", "and", ".NET", "stuff. that", 

(по какой-то причине «» появляется в течение последнего ключевого слова, и он пропускает „работу“

Если изменить положение ABBRV к

fragment ABBRV : ('.'WORD); 

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

Любая помощь, которую вы можете дать, будет высоко оценена.

ответ

0

Есть пара вещей, сначала ваше правило игнорирования парсера никогда не будет запущено и даже не должно появляться в этой грамматике (также не следует из корневого правила). Конечно, поскольку вы отлаживали и имели правило игнорирования, это намного легче проверить (сбросив skip(), в правиле lexer IGNORE).

Теперь, чтобы объяснить тестовые данные, поскольку ни один из токенов лексера не соответствует только WORD '.' конец ваших тестовых данных игнорируется из-за периода сразу после текста. Если вы поместите пробел между «работой» и периодом, тогда появится последнее слово, и период не появится, это то, что вы хотите. Лексер не знает, что делать с «работой». когда он заканчивается. Если вы добавите другое слово в конце (поставьте пробел между периодом и новым словом), тогда «работайте». передается из правил lexer как один токен IGNORE. Я бы подумал, что слово будет передано, а период должен быть только в токере IGNORE.

+0

Благодаря Wayne - это, вероятно, явный признак того, если моя неопытность с ANTLR - но с использованием ANTLRWorks я получаю NoViableAltExceptions без правила «Игнорировать»? Кроме того, неожиданная фраза «материал. Что» как-то возвращается как ключевое слово, а не токен игнорирования? И я не понимаю, почему? благодарит за вашу помощь –

0

Я решил попытаться решить вашу проблему с помощью грамматики ANTLR3. Это то, что я придумал, с некоторыми прилагаемыми строками:

  • Ваша спецификация не содержит много правил, и, как следствие, моя грамматика не очень тщательна.
  • Рассмотрите возможность добавления в KEYW, чтобы совместить больше токенов.
  • У меня нет совместимого с C# ANTLR прямо сейчас. Используйте «skip()», чтобы сделать его совместимым.

    grammar TestSplitter; 
    
    start: (KEYW DELIM!?)* ; 
    KEYW: ('a'..'z'|'A'..'Z'|'.')+ ; 
    DELIM: '.'? ' '+ ; 
    
Смежные вопросы