antlr4,琐碎的语法,令牌识别错误

时间:2017-08-31 15:02:08

标签: parsing antlr4

作为antlr4的完全初学者,我无法使用类似question的答案。在我看来,片段只是通过终端规则在我的语法中调用,但是当提交字符串“myIdentifier”时,解析器仍然会抛出以下错误:

line 1:0 token recognition error at: 'm'
line 1:1 token recognition error at: 'y'
line 1:2 token recognition error at: 'I'
line 1:3 token recognition error at: 'd'
line 1:4 token recognition error at: 'e'
line 1:5 token recognition error at: 'n'
line 1:6 token recognition error at: 't'
line 1:7 token recognition error at: 'i'
line 1:8 token recognition error at: 'f'
line 1:9 token recognition error at: 'i'
line 1:10 token recognition error at: 'e'
line 1:11 token recognition error at: 'r'

我的语法是这样的:

grammar Sable;

options {

}

@header {
    package org.sable.parser.gen;
}

IDENTIFIER:
    (IdentifierHead IdentifierCharacter*)
    | ('`'(IdentifierHead IdentifierCharacter*)'`')
    ;

WS  :  [ \u0020\u000C\u000A\u000D\u0009u000B\u000C]+ -> skip
    ;

COMMENT
    :   '/*' .*? '*/' -> channel(HIDDEN)
    ;

LINE_COMMENT
    :   '//' ~[\u000A\u000D]* -> channel(HIDDEN)
    ;




// NOTE: a file with zero statements is allowed because
// it can contain just comments.
sourceFile:
    statement* EOF;

statement:
    expression ';'?;

// Req. not existing any valid expression starting from
// an equals sign or any other assignment operator.
expression:
    valuedExpression (assignmentOperator valuedExpression)?;

valuedExpression:
    IDENTIFIER
    ;

assignmentOperator:
    '='
    | '*='
    | '/='
    | '%='
    | '+='
    | '-='
    | '<<='
    | '>>='
    | '&='
    | '^='
    | '|='
    ;

fragment DecimalDigit:
    '0'..'9'
    ;

fragment IdentifierHead:
    'a'..'z'
    | 'A'..'Z'
    | '_'
    | '\u00A8'
    | '\u00AA'
    | '\u00AD'
    | '\u00AF' |
    '\u00B2'..'\u00B5' |
    '\u00B7'..'\u00BA'  |
    '\u00BC'..'\u00BE' |
    '\u00C0'..'\u00D6' |
    '\u00D8'..'\u00F6' |
    '\u00F8'..'\u00FF' |
    '\u0100'..'\u02FF' |
    '\u0370'..'\u167F' |
    '\u1681'..'\u180D' |
    '\u180F'..'\u1DBF' |
    '\u1E00'..'\u1FFF' |
    '\u200B'..'\u200D' |
    '\u202A'..'\u202E' |
    '\u203F'..'\u2040' |
    '\u2054' |
    '\u2060'..'\u206F' |
    '\u2070'..'\u20CF' |
    '\u2100'..'\u218F' |
    '\u2460'..'\u24FF' |
    '\u2776'..'\u2793' |
    '\u2C00'..'\u2DFF' |
    '\u2E80'..'\u2FFF' |
    '\u3004'..'\u3007' |
    '\u3021'..'\u302F' |
    '\u3031'..'\u303F' |
    '\u3040'..'\uD7FF' |
    '\uF900'..'\uFD3D' |
    '\uFD40'..'\uFDCF' |
    '\uFDF0'..'\uFE1F' |
    '\uFE30'..'\uFE44' |
    '\uFE47'..'\uFFFD'
    ;
fragment IdentifierCharacter:
    DecimalDigit
    | '\u0300'..'\u036F'
    | '\u1DC0'..'\u1DFF'
    | '\u20D0'..'\u20FF'
    | '\uFE20'..'\uFE2F'
    | IdentifierHead
    ;

我做错了什么?我的假设是:

  • IDENTIFIER 是终端
  • IdentifierHead IdentifierCharacter 是 片段
  • 其余的都是解析规则。

1 个答案:

答案 0 :(得分:1)

根据Bart Kiers的评论:

  

当我测试你的语法时,“myIdentifier”被标记为IDENTIFIER。   也许您需要重新生成词法分析器/解析器?有和没有   空选项{}阻止它工作正常。

事实证明问题出在我的环境中而不是我的语法中。我使用Certiv的antlr4支持插件来生成我的语法。一旦我开始使用命令行中的antlr4生成语法,错误就会消失。