我有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: '\'' (~'\'' | '\'\'')* '\'';
尽管我一开始因为各种原因而“否定”(参见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信息源达到自动更新,同时使用解析模板进行生成。 无需任何其他操作,导入即可使