Parsing antlr4,普通语法,标记识别错误

Parsing antlr4,普通语法,标记识别错误,parsing,antlr4,Parsing,Antlr4,作为antlr4的一名完全初学者,我还没有能够利用类似问题的答案。在我看来,片段仅在我的语法中由终端规则调用,但在提交字符串“myIdentifier”时,解析器仍然抛出以下错误: 我的语法是: grammar Sable; options { } @header { package org.sable.parser.gen; } IDENTIFIER: (IdentifierHead IdentifierCharacter*) | ('`'(Identifier

作为antlr4的一名完全初学者,我还没有能够利用类似问题的答案。在我看来,片段仅在我的语法中由终端规则调用,但在提交字符串“myIdentifier”时,解析器仍然抛出以下错误:

我的语法是:

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
    ;
语法;
选择权{
}
@标题{
包org.sable.parser.gen;
}
标识符:
(IdentifierHead IdentifierCharacter*)
|('`'(IdentifierHead IdentifierCharacter*)'`')
;
WS:[\u0020\u000C\u000A\u000D\u0009u000B\u000C]+->跳过
;
评论
:   '/*' .*? '*/' -> 频道(隐藏)
;
行注释
:“/”~[\u000A\u000D]*->通道(隐藏)
;
//注意:允许使用零语句的文件,因为
//它可以只包含注释。
源文件:
报表*EOF;
声明:
表达式“;”?;
//请求。不存在任何从开始的有效表达式
//等号或任何其他赋值运算符。
表达方式:
valuedExpression(赋值运算符valuedExpression)?;
值表达式:
标识符
;
转让经营人:
'='
| '*='
| '/='
| '%='
| '+='
| '-='
| '='
| '&='
| '^='
| '|='
;
片段小数位数:
'0'..'9'
;
碎片识别头:
“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'..'\u1ff'|
'\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'
;
片段标识符字符:
小数位数
|'\u0300'..'\u036F'
|'\u1DC0'..'\u1DFF'
|'\u20D0'..'\u20FF'
|'\uFE20'..'\uFE2F'
|识别头
;
我做错了什么?我的假设是:

  • 标识符是一个终端
  • 识别头和识别字符是 碎片
  • 其余的都是解析规则

  • 根据巴特·基尔斯的评论:

    当我测试语法时,“myIdentifier”被标记为标识符。 也许您需要重新生成lexer/parser?有无 空选项{}块它可以正常工作


    原来问题出在我的环境而不是语法上。我使用Certiv的antlr4支持插件来生成语法。当我开始从命令行使用antlr4生成语法时,错误就消失了。

    我没有完全更改在线找到的测试语法的一部分的规则,并且我在类似的测试字符串中也有相同的错误。由于两种错误情况下唯一常见的部分是options和@header指令,我猜错误可能是由它们引起的。当我测试语法时,
    将“myIdentifier”
    标记为
    标识符。也许您需要重新生成lexer/parser?不管有没有空的
    选项{}
    块,它都可以正常工作。非常感谢你的意见。嗯,这是有道理的,至少在某种程度上是我的环境出了问题,而不是我的语法。我正在使用Certiv的Eclipse嵌入式生成器。我将尝试通过一个独立安装的antlr4来实现这一点,看看它是如何运行的。好吧,就是这样-我不知道为什么,但是Certiv的插件生成的类只会使相同语法的测试失败。再次感谢你的评论,它把我推向了正确的方向。没有顶级答案。我可以用你的评论作为答案来结束这个问题吗?很好!请随意创建您自己的答案并接受它。
    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
        ;