Как изменить тип токена в правиле парсера в ANTLR с использованием языка CSharp3 - PullRequest
0 голосов
/ 24 июля 2011

Я использую ANTLR 3.3 с языком CSharp3.

В моих типах токенов у меня есть токены WORD, UTTAR, PRADESH, UPABBR и другие. У меня также есть правило следующим образом

specialSynonym5     : (UTTAR PRADESH)=>a=UTTAR b=PRADESH -> ^(SpecialSynonymNode ^(SynonymNode $a $b) ^(SynonymNode UPABBR))
      | (UPABBR) => a=UPABBR -> ^(SpecialSynonymNode^(SynonymNode $a) ^(SynonymNode UTTAR PRADESH))
      | UTTAR;
      | PRADESH;

Что я хотел бы сделать, это изменить типы токенов на WORD, чтобы после обработки этих правил типы токенов были WORD. Я пробовал несколько вариантов, но ни один из них не удался.

Спасибо.

1 Ответ

0 голосов
/ 25 июля 2011

Я обнаружил, что решение состоит в том, чтобы сделать следующее:

specialSynonym5     : (UTTAR PRADESH)=>a=UTTAR b=PRADESH { a.Type = WORD; } -> ^(SpecialSynonymNode ^(SynonymNode $a $b) ^(SynonymNode UPABBR))      
| (UPABBR) => a=UPABBR { a.Type = WORD; } -> ^(SpecialSynonymNode^(SynonymNode $a) ^(SynonymNode UTTAR PRADESH))      
| a=UTTAR { a.Type = WORD; };      
| a=PRADESH { a.Type = WORD; };

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

Получил это тоже.Создайте токен, используя {(object) adaptor.Create (WORD, "")}.Таким образом, правило становится

specialSynonym5     : (UTTAR PRADESH)=>a=UTTAR b=PRADESH { a.Type = WORD; } -> ^(SpecialSynonymNode ^(SynonymNode $a $b) ^(SynonymNode {(object)adaptor.Create(WORD, "u.p.")} ))      
| (UPABBR) => a=UPABBR { a.Type = WORD; } -> ^(SpecialSynonymNode^(SynonymNode $a) ^(SynonymNode {(object)adaptor.Create(WORD, "uttar")} {(object)adaptor.Create(WORD, "pradesh")}))      
| a=UTTAR { a.Type = WORD; };      
| a=PRADESH { a.Type = WORD; };

Возможно, есть лучшее решение, чем это, но сейчас это то, что у меня есть.

...