具有长度前缀的文字字符串的ANTLR语法

时间:2012-05-30 14:29:17

标签: c# antlr grammar antlr3

如何在ANTLR中编写以下BNF语法?

literal = "{" number "}" CRLF *CHAR8
        ; Number represents the number of CHAR8s

例如,{6}\r\nLENGTH应映射到"LENGTH"字符串。

以下工作会怎样?

literal: 
   | '{' ('0'..'9')+ '}\r\n'  
        {  
            // C# Code for Lexer
            Text = Text.Trim();
            int n = int.Parse(Text.Substring(1,Text.Length-2));
            Text = "";
            for(int i=0;i<n;i++){
               input.Consume();
            }            
        }
  ;

我将此作为Lexer规则运行,但问题是我得到了不匹配的令牌,我没有得到令牌作为文字。

1 个答案:

答案 0 :(得分:0)

此解决方案正常运行,

literal: 
   | '{' ('0'..'9')+ '}\r\n'  
        {  
            // C# Code for Lexer
            Text = Text.Trim();
            int n = int.Parse(Text.Substring(1,Text.Length-2));
            Text = "";
            for(int i=0;i<n+1;i++){
               Text += (char) input.LA(1);
               input.Consume();
            }            
        }
  ;

Text += (char)input.LA(1);缺失了,出于某种原因,我们必须将i从0计算到n + 1.