2012-05-30 6 views
0

다음 BNF 문법을 ANTLR에 쓰려면 어떻게해야합니까? 예를 들어 {6}\r\nLENGTHANTLR 길이 접두사가있는 리터럴 문자열의 문법

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

"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(); 
      }    
     } 
    ; 

가 나는 렉서 규칙과이 작업을 얻고 있지만, 문제는 내가 일치하지 않는 토큰을 얻고, 내가 토큰으로 문자 받고 있지 않다. 이 솔루션은 제대로 작동

+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);

가 누락되었고, 어떤 이유로, 우리는 N + 0에서 1로 내가 계산해야합니다.