当前位置: 首页 > 知识库问答 >
问题:

解析器和Lexer规则重叠

颛孙国源
2023-03-14

我有Antlr4中的语法,用来解析和验证定制语言。在其他方面,我的语法应该认为以下是“有效的”

//将字符串值赋给变量
myvar='a string';
//带有字符串参数的函数

//带有字符串参数的函数('this isanarg');

//带有特定格式(日期)的函数
secondfunction('26/06/2016');

下面是我语法中的相关部分

/*
 * Parser Rules
*/
function_call
     : firstFunction'(' literal ')'
     | secondFunction '(' date_formated_string ')'

literal
    : SINGLE_QUOTE_STRING
    | date_formated_string
    | '(' literal ')'  // recursive parentheses
    ;

date_formated_string
    : '\'' day = (TWO_DIGITS | ONE_DIGIT) ('/') month = (TWO_DIGITS | ONE_DIGIT) ('/') year = FOUR_DIGITS '\'';

/*
 * Lexer Rules
 */
SINGLE_QUOTE_STRING:            '\'' (~'\'' | '\'\'')* '\'';

共有1个答案

孔俊爽
2023-03-14

尽管我一开始因为各种原因而“否定”(参见Question的评论讨论),但我决定遵循@Lucastrzesniewski并将额外的验证逻辑放入代码中,而不是语法文件中。

逻辑很简单:

  • 我创建了ValidationListener,它扩展/继承了在构建语法(.g4文件)时创建的BaseListener。我重写了任何需要进行其他验证的方法。在本例中,我重写了enterfunction_call
  • 我从现在开始制作的每个监听器都必须扩展/继承ValidationListener而不是BaseListener
  • 每次在任何侦听器中重写方法时,都会重写ValidationListener,我必须确保基。{methodName}()首先被调用,以便“自定义”验证在执行之前。

 类似资料:
  • 可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?

  • 我们在ANTLR中遇到的问题是,我们有这样一个语法: 请记住“鲍勃。”第一行是动态的,可以是任何东西。其中之一就是“鲍勃”。“Bob Offset”行不是动态的,它存在于我们正在解析的每一个类型的文件中。 理想的解决方案是,如果ANTLR有某种方法来指定上下文或解析器规则特定的lexer规则。这样,“Bob offset:”标记在语法中的其他地方就不会出错了。 对此问题的任何想法都将不胜感激。

  • 我正在使用antlr4 c语法作为我自己语法的灵感。我来了一件事,我真的不明白。为什么没有使用数据类型时会有Lexer规则?例如,规则从未使用过,但分析器规则(为了简化已删除其他数据类型)使用了好几个地方。解析器规则typeSpecifier没有使用lexer规则double有什么原因吗?

  • ANTLR语法中解析器和词法分析器规则的调用顺序是什么?例如,在以下语法中,输入 223 始终标识为APLHANUMERIC而不是数字

  • CloudGate解析规则可以直接导入使用,不需要任何额外的操作,非常方便! 规则列表 规则名称 下载地址 Surge https://async.be/Rule/Basic/Hosts Shadowrocket https://async.be/Rule/Basic/Hosts 解析规则 简要概述:通过实时同步Hosts信息源达到自动更新,同时使用解析模板进行生成。 无需任何其他操作,导入即可使