2016-07-04 37 views
0

我有以下antlr4語法:antlr4文字字符串處理

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: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"; 
} 

我得到這個:

@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*? '"'; 

,使其非貪婪。