如何处理表达式或变量名中出现的特定于语言的保留字

时间:2013-03-11 05:47:52

标签: java coldfusion antlr4

我现在已经解决了这个问题大约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.returnvariables.returnlocal["return"]。这同样适用于ifelsesavecontent以及许多其他单词,所有这些单词仅在范围内有效,但不作为变量或表达式的第一项有效:{{1 }}无效,但if.blah = "something"有效。这意味着我将遇到与这些术语中的每一个相同的问题,因为它们会与抓取它们的解析器规则冲突。

综合Bart所说的,这是解决这个问题的一种干净方法吗?

blah.if = "something"

1 个答案:

答案 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}}