Antlr 4语法与空格

介绍

这篇文章讨论了在不从要分析的文本中删除空格的情况下创建Antlr语法的困难和解决方案。 但首先,简要解释一下Antlr的真正含义。

这是链接https://github.com/antlr/antlr4 。 Antlr可以采用规则明确的文本,并从中创建语法树。 基本上这就是它的优点。 用户必须创建DSL(特定于域的语言)的语法并将其提供给工具。 该工具生成解析器代码。 它可以是Java代码或Javascript代码。 Antlr具有不少于5个目标(支持的语言)。 生成的解析器代码可以解析文本并创建抽象语法树。 然后,用户可以使用生成的访问者(这是众所周知的访问者模式)来遍历AST,以从中获取某些东西。

问题

大多数Antlr语法都像这样删除词法分析器中的空白:

WS
:[\ r \ n \ t] +->跳过
;

这肯定会使解析过程变得容易一些,因为它可以转换此表达式:
q1 + q2 / f2 –(4 + 5) 变成一个更简单的形式: q1 + q2 / f2-(4 + 5) 没有这些空格,编写Antlr语法的规则就容易得多。 但是在某些情况下,不可能删除所有空格,因为它们可能是变量名的一部分。 在这种情况下,我正在处理单引号这样的变量:“变量1”。 空格是变量名的一部分。 语法必须考虑到空格可以是变量名的一部分,但也可以是用户为了可读性而输入的“无用”字符,例如逗号后的空格。 需要特殊的空格处理才能解析此表达式:

'变量ABC'* 5 +'变量Q'*(1 +'变量W')

这个想法是这样的:如果我们不能从文本中删除空格,我们必须将空格“拉”入括号,运算符等。

运算符和括号的规则必须更改以插入空格。 首先,我们需要声明空格的标记:

ANY_SPACE:SINGLE_SPACE +;

SINGLE_SPACE:“”;

我们不能使用SINGLE_SPACE *,因为Antlr工具正确显示SINGLE_SPACE *可以匹配一个空字符串。

然后将这些标记合并到运算符规则中(MUL为'*'和Div为'/',rParameterSeparator用于分隔函数实际参数的逗号
):

rLeftVarParenthesis:L_VAR_PAREN ANY_SPACE | L_VAR_PAREN;

rArithmeticOperatorMulDiv:ANY_SPACE(MUL | DIV)ANY_SPACE | ANY_SPACE(MUL | DIV)| (MUL | DIV)ANY_SPACE | (MUL | DIV);

rParameterSeparator:ANY_SPACE','ANY_SPACE | ANY_SPACE','| ','ANY_SPACE | ',';

现在,该语法可以处理名称中带有空格的变量。 访问者在访问操作员规则时可以加入子级中的文本,并使用修剪删除所有不必要的空间。 用Javascript可能看起来像这样:

返回ctx.children.join(”)。trim();

这个简单而优雅的解决方案允许使用空格来解析变量名。

翻译自: https://www.javacodegeeks.com/2019/11/antlr-4-grammar-with-spaces.html

你可能感兴趣的:(Antlr 4语法与空格)