2017-04-05 79 views
0

因此,我正在使用ANTLRWorks 2.1在ANTLR4中使用组合语法。我有词法规则IdentifierBlock,这些规则不被识别为定义的词法分析器规则,但仅在最后一个定义的分析器规则中。这些规则删除(或隐藏)这些错误后添加一个文字。ANTL 4 Lexer规则无法在组合语法中识别

我,并在最后的错误语法(斜体令牌引发错误):

grammar GCombined; 

options { language = Cpp; } 

@lexer::namespace{AntlrTest01} 
@parser::namespace{AntlrTest01} 

    /* First Lexer Stage */ 

Bit: '0' | '1'; 
Digit : '0'..'9'; 
ODigit: '0'..'7'; 
XDigit: '0'..'f'; 
Letter: ('a'..'z') | ('A'..'Z'); 
Symbol: '|' 
     | '-' 
     | '!' 
     | '#' 
     | '$' 
     | '%' 
     | '&' 
     | '(' 
     | ')' 
     | '*' 
     | '+' 
     | ',' 
     | '-' 
     | '.' 
     | '/' 
     | ':' 
     | ';' 
     | '<' 
     | '=' 
     | '>' 
     | '?' 
     | '@' 
     | '[' 
     | ']' 
     | '^' 
     | '_' 
     | '`' 
     | '{' 
     | '|' 
     | '}' 
     | '~'; 
WSpace: (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     | '\c' 
     | '\0' 
     | '\u000C' 
     )+ -> skip; 

DNumber: Digit+; 
ONumber: '0o' Digit+; 
XNumber: '0x' Digit; 
Integer: DNumber 
     | ONumber 
     | XNumber; 
Float: DNumber '.' DNumber; 

Character: Letter 
     | Digit 
     | Symbol 
     | WSpace; 
String: Character+; 
Literal: '"' String '"'; 

Boolean: 'true' | 'false'; 

    /* Second Lexer Stage */ 

Number: Integer | Float; 
Identifier: Letter (Letter | Digit | '_')+; 
Keyword: Letter+; 
Operator: '+' 
     | '-' 
     | '*' 
     | '/' 
     | '%' 
     | '==' 
     | '!=' 
     | '>' 
     | '<' 
     | '>=' 
     | '<=' 
     | '&&' 
     | '||' 
     | '^' 
     | '&' 
     | '|' 
     | '<<' 
     | '>>' 
     | '~' ; 

Expression: (Operator | Identifier) 
     '(' (Identifier | Number)+ ')'; 
Parameter: Identifier 
     | Expression 
     | Number; 
Statement: Keyword '(' Parameter+ ')'; 
Block: '{' Statement+ '}'; 

    /* Third Lexer Stage */ 

Add: '+'; 
Sub: '-'; 
Mlt: '*'; 
Div: '/'; 
Mod: '%'; 
Mathop: Add | Sub | Mlt | Div | Mod; 

Deq: '=='; 
Neq: '!='; 
Gtr: '>'; 
Lss: '<'; 
Geq: '>='; 
Leq: '<='; 
Condop: Deq | Neq | Gtr | Lss | Geq | Leq; 

And: '&&'; 
Or: '||'; 
Xor: '^'; 
Bnd: '&'; 
Bor: '|'; 
Logop: And | Or | Xor | Bnd | Bor; 

Neg: '!'; 
Boc: '~'; 
Negop: Neg | Boc; 

Asl: '<<'; 
Asr: '>>'; 
Shftop: Asl | Asr; 

Eql: '='; 

Inc: '++'; 
Dec: '--'; 
Incop: Inc | Dec; 

Peq: '+='; 
Meq: '-='; 
Teq: '*='; 
Seq: '/='; 
Req: '%='; 
Casop: Peq | Meq | Teq | Seq | Req; 

Lparen: '('; 
Rparen: ')'; 
Lbrack: '['; 
Rbrack: ']'; 
Lbrace: '{'; 
Rbrace: '}'; 
Point : '.'; 
Colon : ':'; 

Numvar: Number 
     | Identifier 
     | Mathop '(' Parameter+ ')'; 
Boolvar: Boolean 
     | Identifier 
     | Condop '(' Parameter+ ')' 
     | Logop '(' Parameter+ ')'; 
Metaxpr: (Identifier | Operator) '(' Parameter+ ')'; 

    /* First Parser Stage */ 

    //expressions 

add: '+' '(' Numvar+ ')'; 
sub: '-' '(' Numvar+ ')'; 
mlt: '*' '(' Numvar+ ')'; 
div: '/' '(' Numvar+ ')'; 
mod: '%' '(' Integer+ ')'; 
mathexpr: add 
     | sub 
     | mlt 
     | div 
     | mod; 

eql: '==' '(' Parameter+ ')'; 
neq: '!=' '(' Parameter+ ')'; 
gtr: '>' '(' Parameter+ ')'; 
les: '<' '(' Parameter+ ')'; 
geq: '>=' '(' Parameter+ ')'; 
leq: '<=' '(' Parameter+ ')'; 
condexpr: eql 
     | neq 
     | gtr 
     | les 
     | geq 
     | leq; 

and: '&&' '(' Parameter+ ')'; 
or : '||' '(' Parameter+ ')'; 
xor: '^' '(' Parameter+ ')'; 
bnd: '&' '(' Parameter+ ')'; 
bor: '|' '(' Parameter+ ')'; 
logexpr: and 
     | or 
     | xor 
     | bnd 
     | bor; 

asl: '<<' '(' Parameter Numvar ')'; 
asr: '>>' '(' Parameter Numvar ')'; 
shiftexpr: asl | asr; 

neg: '!' '(' Parameter ')'; 
boc: '~' '(' Parameter ')'; 
negexpr: neg 
     | boc; 

arrexpr: Identifier '[' Numvar ']'; 

    //instruction forms 

vardec: 'def' '(' Identifier+ ')' ': ' Identifier ; 
lindec: Identifier '(' Identifier ')'; 
assign: '=' '(' (Identifier | lindec) Parameter ')'; 

incstmt: (Inc | Dec) '(' Identifier ')' 
     | Casop '(' Identifier Identifier ')'; 

cond: 'if' '(' Boolvar ')' Block 
    ('else if' '(' Boolvar ')' Block)? 
    ('else' Block)?; 

loop: (
     ('while' '(' (condexpr | negexpr) ')') 
    | ('for' '(' assign ',' (condexpr | negexpr) ',' incstmt')') 
    ) Block; 

fundef: 'func' '(' Identifier Parameter+ ')' ': ' Identifier Block; 
prodef: 'proc' '(' Identifier Parameter* ')' Block; 
call: Identifier '(' Parameter+ ')'; 

excHandler: 'try' Block 
      'catch' '(' Identifier ')' Block 
      ('finally' Block)?; 

classdef: 'class' '(' Identifier ')' (': ' _Identifier_)? _Block_; 
+1

需要提供演示错误的完整语法。 – GRosenberg

回答

0

ANTLR需要明确的语法规则。在提供的语法中,Symbol规则与Operator规则和其他规则冲突。 IdentifierLetter规则冲突。规则冲突时,他们可以匹配相同的输入(内容&长度)。

另外,例如,Symbol规则包括'{'作为alt。后续使用文字'{'(这是一种隐式标记类型)的规则将不匹配,因为隐式标记类型与Symbol标记类型不同。最佳做法是避免重复使用文字 - 在规则中定义文字,然后引用该规则。

最好的建议是购买TDAR的副本来学习Antlr4。

+0

我一直在阅读教程和编码。你看。逆转词法分阶段的顺序解决了问题! –

+0

通过重新排列,其他冲突规则现在无法按预期工作! Antlr没有处理含糊不清的问题 - 它只是(总是)使用第一个冲突规则(自上而下),其结果是功能上隐藏了剩下的内容。 – GRosenberg