2012-05-30 34 views
0

如何在ANTLR中编写以下BNF语法?ANTLR语法字符串的长度前缀的语法

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规则工作,但问题是我得到不匹配的标记,我没有得到作为文字的标记。

+0

会在2个步骤中做到这一点的解决方案是否可以吗?例如通过两次检查,左边的数字和右边的字符串长度相同。 – user7116

+0

我没有得到你,我不太了解ANTLR,我刚刚看到它生成的C#,并基于我写的这个,问题是,它有几个方法,如LeaveRule等,我想知道什么是我最后声明? LeaveRule()应该被调用或不。 –

+0

@ SwDevMan81为什么C#被从这里删除? ANTLR语法的目标语言是C# –

回答

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);失踪出于某种原因,我们必须从0开始计数我到n + 1。