2016-07-04 3 views
0

나는 다음과 같은 antlr4 문법이 :하지만이 파일을antlr4 리터럴 문자열

@0,0:0='z',<16>,1:0 
@1,2:2='=',<1>,1:2 
@2,4:20='"global variable"',<14>,1:4 
@3,21:21=';',<2>,1:21 
@4,26:30='class',<11>,3:0 
@5,32:35='Base',<16>,3:6 
@6,38:38='{',<3>,4:0 
@7,42:42='z',<16>,5:1 
@8,44:44='=',<1>,5:3 
@9,46:47='10',<15>,5:5 
@10,48:48=';',<2>,5:7 
@11,51:51='}',<4>,6:0 
@12,56:55='<EOF>',<-1>,8:0 

:

z = "global variable"; 

class Base 
{ 
    z = 10; 
} 

모든 것이 괜찮 :이 파일을 구문 분석하면 지금

grammar squirrel; 

program: globalstatement+; 

globalstatement: globalvardef | classdef | functiondef; 

globalvardef: IDENT '=' constantexpr ';'; 

classdef: CLASS IDENT '{' classstatement+ '}'; 

functiondef: FUNCTION IDENT '(' parameterlist ')' functionbody; 

constructordef: CONSTRUCTOR '(' parameterlist ')' functionbody; 

parameterlist: IDENT (',' IDENT)* | ; 

functionbody: '{' statement* '}'; 

classstatement: globalvardef | functiondef | constructordef; 

statement: expression ';'; 


expression: 
    IDENT # ident | 
    IDENT '=' expression # assignment | 
    IDENT ('.' IDENT)+ # lookupchain | 
    constantexpr # constant | 
    IDENT '(' expressionlist ')' # functioncall | 
    expression '+' expression # addition; 

constantexpr: INTEGER | STRING; 

expressionlist: expression (',' expression)* | ; 

CONSTRUCTOR: 'constructor'; 
CLASS: 'class'; 
FUNCTION: 'function'; 
COMMENT: '//'.*[\n]; 
STRING: '"' CHAR* '"'; 
CHAR: [ a-zA-Z0-9]; 
INTEGER: [0-9]+; 
IDENT: [a-zA-Z]+; 
WS: [ \t\r\n]+ -> skip; 

을 :

z = "global variable"; 

class Base 
{ 
    z = "10"; 
} 

난이 얻을 :

@0,0:0='z',<16>,1:0 
@1,2:2='=',<1>,1:2 
@2,4:49='"global variable";\r\n\r\nclass Base\r\n{\r\n\tz = "10"',<14>,1:4 
@3,50:50=';',<2>,5:9 
@4,53:53='}',<4>,6:0 
@5,58:57='<EOF>',<-1>,8:0 

그래서 그것은 문자 그대로 하나의 문자열과 일치됩니다 파일에 최초의 "마지막"사이에있는 모든처럼 보인다.

어떻게 방지합니까?

답변

1

문자열은 첫 번째 따옴표에서 마지막 가능한 따옴표까지 일치합니다.

기본적으로 ANTLR의 Kleene 연산자 (*)는 욕심이 있습니다. 그래서, 비 욕심 수 있도록

STRING: '"' CHAR*? '"'; 

STRING: '"' CHAR* '"'; 

을 변경합니다.