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