我已经在这个问题上工作了大约 4 个小时。这是我的 ANTLR V4 语法文件,我已将其精简为最简单的示例。
grammar Cfscript;
component
: (statement)*
;
statement
: 'return' expression? ';'
| statementExpression ';'
;
statementExpression
: expression
;
expression
: primary
| expression '.' Identifier
;
primary
: Identifier
;
Identifier
: [a-zA-Z0-9_]+
;
WS
: [ \t\r\n]+ -> skip
;
我的文件包含
local.return;
当我尝试解析这个在 component
处输入的文件时,我收到以下错误:mismatched input 'return' expecting Identifier
。我无法弄清楚为什么会出现此错误。
更新
如果我理解正确的话,这是因为 return
是 Java 中的保留字,这就是为什么他们以这种方式构建语法。在我的语言中,Coldfusion Cfscript,return
只要在以下范围内就有效:local.return
、variables.return
、local [“返回”]
。这也适用于 if
、else
、savecontent
和许多其他词,所有这些都只在范围内有效,而不是作为第一个术语变量或表达式:if.blah = "something"
无效,但 blah.if = "something"
有效。这意味着我将对这些术语中的每一个都遇到同样的问题,因为它们将与获取它们的解析器规则发生冲突。
综合 Bart 所说的,这是解决这个问题的一种干净的方法吗?
grammar Cfscript;
component
: (statement)*
;
statement
: K_Return expression? ';'
| expression ';'
;
expression
: primary
| expression '.' secondary
;
primary
: Identifier
;
secondary
: K_Return
| K_If
| K_Else
| Identifier
;
K_Return : 'return' ;
K_If : 'if' ;
K_Else : 'else' ;
Identifier
: [a-zA-Z0-9_]+
;
WS
: [ \t\r\n]+ -> skip
;
最佳答案
在解析器规则中添加文字标记,就像您对 'return'
所做的那样,不 是否意味着词法分析器将匹配字符串 "return"
作为 expression
规则中第二个替代项中的 Identifier
:
expression '.' Identifier
如果您想将 "return"
匹配为您语言中的关键字 和 作为标识符,您需要创建一个匹配 标识符的解析器规则
和关键字:
expression
: primary
| expression '.' id
;
primary
: id
;
id
: Identifier
| K_Return
;
// Better explicitly define them instead of litering keywords inside parser rules
K_Return
: 'return'
;
Identifier
: [a-zA-Z0-9_]+
;
关于java - 如何处理出现在表达式或变量名称中的特定于语言的保留字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15331979/