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

如何在一个规则中指定多个lexer规则?

薛云瀚
2023-03-14

我有以下解析器规则:

declaration     : (KW_VARIABLE DT_IDENTIFIER) |
                  (KW_VARIABLE DT_IDENTIFIER OP_ASSIGNMENT DT_DATA_TYPES) OP_SEMICOLON;

和以下lexer规则:

KW_VARIABLE     : 'var';

OP_ASSIGNMENT   : '=';
OP_SEMICOLON    : ';';

DT_IDENTIFIER   : [a-z]+;
DT_INTEGER      : [0-9]+;
DT_DATA_TYPES   : (DT_IDENTIFIER | DT_INTEGER);

有了上面的规则,我想能够写出下面的代码

var a = 10;
var b = 40;
var c = 50;
var d = c;
public override void ExitDeclaration([NotNull] PyroParser.DeclarationContext context)
{
    bool isAssigned = context.OP_ASSIGNMENT() != null;

    if (!isAssigned)
    {
        return;
    }

    Console.WriteLine(context.DT_DATA_TYPES().GetText());
    base.ExitDeclaration(context);
}

共有1个答案

沃博裕
2023-03-14

这是不正确的:

DT_IDENTIFIER   : [a-z]+;
DT_INTEGER      : [0-9]+;
DT_DATA_TYPES   : (DT_IDENTIFIER | DT_INTEGER);

一旦dt_identifierdt_integer匹配,它就永远不会变成dt_data_types。lexer从上到下匹配规则,一旦找到匹配,就不会放弃。并简单地更改规则的顺序:

DT_DATA_TYPES   : (DT_IDENTIFIER | DT_INTEGER);
DT_IDENTIFIER   : [a-z]+;
DT_INTEGER      : [0-9]+;

也不会起作用:这样lexer就永远不会生成dt_identifierdt_integer令牌。

dt_data_types   : (DT_IDENTIFIER | DT_INTEGER);

DT_IDENTIFIER   : [a-z]+;
DT_INTEGER      : [0-9]+;
 类似资料:
  • 问题内容: 所以,这就是我正在做的: 我有一张桌子,上面放着所有的桌子。 但是在一个特殊的场合,我希望一个特定的对象在各个方向都有,我将其设置为。 显然,我将CSS样式依次放在一个外部文件中。 但是渲染的CSS仅具有,并且似乎已被覆盖! 请说明: 这是怎么发生的以及为什么发生? 我应该如何安排这些规则来解决我的问题(除了内联样式)? 编辑:我在表中删除之前。我从来没有使用过它,我只是在这里提到它以

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

  • 我需要以下令牌: 允许的字符包括大写、小写、数字、空格和连字符 长度不固定(长度必须至少为两个字符) 标记必须至少包含一个空格或连字符 令牌必须以大写、小写、数字、空格或连字符开头和结尾(不能以空格开头或结尾) 下面语法中的ANTLR lexer规则“alphanumericspacehyphen”除了一个情况外几乎都起作用。使用解析器规则“sic”进行测试,以下输入将解析(不带引号): 以下输入

  • 问题内容: 如何将其写成一行? 用id和class选择html标签的方法是什么? 问题答案: 您所要做的就是用逗号分隔它们,例如

  • 我在同一个drl文件中有两个Drools规则,如下所示: 我的想法是用第一条规则处理所有处于临界状态的事件。然后使用第二个规则,如果任何阀门有警报,这是由“如果临界”规则设置的,发送一个短信。 你知道吗?用口水可能吗?

  • 我有以下代码: 我想禁用这一行的两种ESLint类型的检查,无返回分配和无参数重新分配。 我这样试过: 但是我的编辑器仍然显示eslint(无返回赋值)lint错误。