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

标签 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 [“返回”]。这也适用于 ifelsesavecontent 和许多其他词,所有这些都只在范围内有效,而不是作为第一个术语变量或表达式: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/

相关文章:

model-view-controller - ColdFusion Model Glue 与 ASP.NET MVC 3 的 @section 的等效项是什么?

mysql - CF10 连接 mysql 字符串作为二进制数据

jquery - 将参数传递到 cluttip 的(冷融合)内容页面

java - 通过ErrorListener累积/收集错误以在解析后进行处理

antlr4 - 如何复制 RuleContext

java - Hibernate 更新查询问题

java - Jacoco jmx 转储,连接重置错误

java - Apache Chemistry OpenCMIS 服务器无法部署在 JBoss AS 7 上

JAVA发送包含XML字符串的Post请求

antlr - 编写 ANTLR 目标