如何使用CSharp3语言在ANTLR中更改解析器规则中的令牌类型

时间:2011-07-24 02:30:56

标签: c# antlr antlr3

我正在使用带有语言CSharp3的ANTLR 3.3。

在我的令牌类型中,我有一个名为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 :(得分:0)

我发现解决方案是执行以下操作:

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; };

可能有一个比这更好的解决方案,但现在这就是我所拥有的。