我现在已经解决了这个问题大约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["return"]
。这同样适用于if
,else
,savecontent
以及许多其他单词,所有这些单词仅在范围内有效,但不作为变量或表达式的第一项有效:{{1 }}无效,但if.blah = "something"
有效。这意味着我将遇到与这些术语中的每一个相同的问题,因为它们会与抓取它们的解析器规则冲突。
综合Bart所说的,这是解决这个问题的一种干净方法吗?
blah.if = "something"
答案 0 :(得分:4)
在解析器规则中添加文字标记,就像使用'return'
一样,不意味着词法分析器将匹配字符串"return"
作为Identifier
内的expression
expression '.' Identifier
规则中的第二个备选方案:
"return"
如果您希望将Identifier
作为关键字和作为您语言的标识符,则需要创建一个与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_]+
;
和关键字匹配的解析器规则:
{{1}}