【问题标题】:My ANTLR3 tree grammar never matches a particular pattern that is very similar to one that does get matched我的 ANTLR3 树语法从不匹配与匹配的非常相似的特定模式
【发布时间】:2013-03-19 12:47:43
【问题描述】:

我正在开发自己的语言应用程序,该应用程序很大程度上基于《语言实现模式》一书中的 Cymbol 语法。我一直在使用 ANTLRworks 来开发我的语法,然后使用 Eclipse 在 Java 中实现完整的应用程序。作为我语法的一部分,我有以下两条规则:

varDeclaration
  :  'var' ID 'is' dataType (':=' expr )? ';'
     -> ^('var' ^(NAME ID) ^(VARTYPE dataType) ^(VALUE expr)?)
  ;
constantDeclaration
  :  'const' ID 'is' dataType ':=' expr ';'
     -> ^('const' ^(NAME ID) ^(VARTYPE dataType) ^(VALUE expr))
  ;

在运行解析器并打印生成的 AST 后,这两个的输出似乎都是正确的。

然后我运行一个符号定义树匹配器(使用 filter-true)来构建一个符号表。除了输入每个功能/块/等。为了开始新的作用域,我还处理了自顶向下规则中的变量和常量的定义(同样,基于语言实现模式一书),如下所示:

topdown
  :  varDeclaration
  |  constDeclaration
  | ...
  ;

varDeclaration
  :  ^('var' ^(NAME ID) .*) //^(VAR ^(NAME ID) .*) Rewrote this for clarity of example
     {
        System.out.println("In a variable declaration");
     }
  ;

constDeclaration
  :  ^('const' ^(NAME ID) .*)
     {
        System.out.println("Const definition");
     }
  ;

我的问题是只有 constDeclaration 匹配。即使我的输入中有 varDeclaration(由 AST 打印输出验证),我也从未在控制台上看到“In a variable declaration”打印,而显示“Const definition”。

我已经尝试了很多方法来调试/解决这个问题:

  • 使变量声明的可选初始化表达式不是可选的,使其在语法上与 const 声明相同,但关键字除外。
  • 将关键字“var”更改为其他内容(在本例中为“splunge”)。
  • 更改了匹配参数以使用特定的通配符(例如 ^(VAR vn=.vt=.vv=.))
  • 尝试将 varDeclaration 置于自底向上规则中。

如您所见,我非常绝望,因为我不知道为什么一个规则和模式匹配而另一个不匹配。变量和常量声明之间唯一的其他区别是常量声明可以发生在代码块内和顶层(对于全局常量),而变量只能在代码块内声明。我不明白这与为什么代码块中的 const 将匹配而 var 不匹配有什么关系。

此代码是不正确匹配的示例:

function foo(int a) returns (int) {
  const PI is real := 3.14159;  // Recognized
  var r is real;                // Not recognized
  var s is int := 4;            // Not recognized
  const TESTCONST is int := 3;  // Recognized
  // Other code (if statements, for loops) recognized.
}

我已经尝试解决这个问题好几天了,但我束手无策。我错过了什么?

其他信息(2013 年 3 月 20 日添加)

为了进一步说明,输入声明,例如

const y is real := 2.4;  // Recognized
var temp is int := 0 ;   // Not recognized

在 AST 中生成以下内容:

(const (NAME y) (VARTYPE (SCALAR (NAME (TYPEID real)))) (VALUE (EXPR 2.4)))
(var (NAME temp) (VARTYPE (SCALAR (NAME (TYPEID int)))) (VALUE (EXPR 0)))

上面的树语法匹配const AST,var AST不匹配。

【问题讨论】:

  • 我假设上面语法中的';是剪切/粘贴错误,而原来的语法实际上包含';'?
  • 是的,你是 --- 我在工作休息时发布了这个,我只有一份我通过电子邮件发送给自己的语法副本,并且必须在插入时删除了结束语换行符。谢谢。

标签: antlr antlr3 antlrworks


【解决方案1】:

在您的解析器中,您匹配文字 'var',但在您的树解析器中,您正在寻找 ^(VAR ...。您的词法分析器是否完全包含以下规则?

VAR : 'var';

对于树解析器中的constDeclaration(您说它有效),您使用的是与解析器中相同的文字语法:^('const' ...

【讨论】:

  • 抱歉,这是我又一次尝试调试的结果。我的词法分析器确实包含 VAR : 'var' 映射,但最初我的树语法是 ^('var' ^(NAME ID)) 类似于 const。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
相关资源
最近更新 更多