2012-04-28 3 views
2

문자열 변수 선언에 대해 다음과 같은 문법을 작성했습니다. 문자열은 작은 따옴표 사이에있는 것과 같이 정의되지만, $ 문자를 사용하여 이스케이프하여 문자열 값에 작은 따옴표를 추가하는 방법이 있어야합니다. 당신이 var_declaration 규칙이 코드를 실행하려고하면ANTLR lexer의 특수 문자 처리

grammar test; 

options  
{ 
    language = Java; 
} 


tokens 
{ 
    VAR = 'VAR'; 
    END_VAR = 'END_VAR'; 
} 


var_declaration: VAR string_type_declaration END_VAR EOF; 

string_type_declaration: identifier ':=' string; 

identifier: ID; 

string: STRING_VALUE; 

STRING_VALUE: '\'' ('$\''|.)* '\''; 

ID: LETTER+; 

WSFULL:(' ') {$channel=HIDDEN;}; 

fragment LETTER: (('a'..'z') | ('A'..'Z')); 

이 문법은 작동하지 않습니다

VAR A :='$12.2' END_VAR 

내가 MismatchedTokenException를 얻을.

그러나이 코드는 string_type_declaration 규칙에 대해 잘 작동이 :

A :='$12.2' 

답변

5

귀하의 STRING_VALUE가 제대로 토큰 화되지 않습니다. 루프 (...)* 안에는 $ 뒤에 작은 따옴표가 있어야하지만 입력 한 문자열 '$12.2'에는 $ 뒤에 따옴표가 없습니다. 작은 따옴표를 선택하여 ('$' '\''? | .)*으로 지정해야합니다. 하지만 지금은 루프에서 대안의 .도 작은 따옴표를 일치 :

STRING_VALUE 
: '\'' ('$' '\''? | ~('$' | '\''))* '\'' 
; 

다음 구문 분석 트리 결과 :

enter image description here 더 나은이 작은 따옴표와 $보다 다른 것을 일치하게