【问题标题】:ANTLR Match class nameANTLR 匹配类名
【发布时间】:2013-11-04 22:57:48
【问题描述】:

在我的语法中,我有分配规则。它是形式 assignment: VAR_TYPE ID '=' expr;

VAR_TYPE 我有一些硬编码的值,比如整数、字符串等。

我想知道的是如何匹配文件中声明的任何类名?

假设有人声明了class FooClass Bar。如何将此标记为有效输入 不使用ID。因为如果我在VAR_TYPE 规则中添加|IDID 将永远不会 匹配,我不想要那个。

【问题讨论】:

  • 为什么不使用ID 而不是VAR_TYPE 开始呢?然后,您可以维护一个声明类型的可扩展容器(这是特定于语言的;在 C++ 中使用 std::vector,在 Python 中使用 list,在 C# 中使用 System.Collecions.Generic.List)并使用它来跟踪,如果未知则抛出错误使用类型。
  • 好的。所以你的建议是放弃 VAR_TYPE ?
  • 差不多。这就是我通常做的,以避免过于复杂的事情。你用的是什么语言??
  • 好的...理论上,您可以在运行时修改规则上下文。但是,我从未使用过 Java,所以我无法帮助您。而且,以防万一,这里是 Java 的列表实现:docs.oracle.com/javase/7/docs/api/java/util/List.html
  • 好的。感谢您的帮助!

标签: parsing antlr grammar lexical-analysis


【解决方案1】:

除非它们实际上是您语言中的关键字,否则您不应该对您的类型名称进行硬编码。然后你创建一个解析器规则来匹配任何类型:

varType : ID;
assignment : varType ID '=' expr;

IntegerString 然后将被视为常规 ID 令牌。

在解析完成后使用侦听器来验证出现在每个varType 中的ID 实际上是指一个类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多