2012-05-30 38 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。