【问题标题】:ANTLR - check semantics/meaning of the valuesANTLR - 检查值的语义/含义
【发布时间】:2011-09-06 07:30:56
【问题描述】:

我有一个简单的语法,它允许用户定义一些带有属性的对象。 例如:

carpark : my carpark
lots: 100

car: BMW
color: red
wheels: 4

motocycle
age: 4
color: red

carpark : my second carpark

car:...
...
car:...
...
...

我用 ANTLR 创建了一个语法来检查那些简单的分配。

现在我在检查分配的顺序或含义时遇到问题。 假设我可以从现有停车场继承

carpark: my third carpark
extends: my second carpark

我应该如何检查“我的第二个停车场”是否已经存在?

此外,我希望某些属性(例如颜色)是可选的,其他属性是强制性的,并且顺序不应该很重要

car: BMW
color: red
age: 4
//should be allowed as
car: BMW
age: 4
color: red

一个简单的规则是

cardefinition
    :   CAR COLON value NEWLINE attributedefinition*
    ;

attributedefinition
    :   attributekey COLON value NEWLINE!
    ;

但是可能没有定义强制属性。 我可以添加一个额外的规则,比如强制属性定义,但是很难以任何顺序允许定义

所以这种检查应该是解析器或树解析器的一部分

【问题讨论】:

  • 嘿 Bart Kiers,首先感谢您在两个线程中的帮助!很快我就得付钱给你了;)好吧,现在我为什么要问这个问题?我认为有很多不同的方法可以做到这一点。问题是什么才是真正合适的。你说你会在你的树解析器中检查双重定义。所以你会实现一些java代码通过树并检查树解析器中的那些双重定义?与扩展相同的事情:“需要的现有价值”一词?我很难区分解析器应该做的事情和树解析器应该做的事情。

标签: parsing antlr semantic-analysis


【解决方案1】:

可以在解析器语法中检查有效的超级公园 (extends ...),但树语法不是您的(组合)语法的混乱版本:所以我喜欢这样做里面有这样的东西。

你可以做的是创建一个Set<String> parks 作为你的 tree walker 的成员:

tree grammar CarParkWalker;

options {
  tokenVocab=CarPark; // assuming your combined grammar is called CarPark.g
  ASTLabelType=CommonTree;
}

@members {
  private Set<String> parks = new HashSet<String>();
}

// rules here

然后在遍历 AST 时添加Strings。然后,当您偶然发现extends VALUE 时,您添加一些自定义代码来检查VALUE.text 是否存在于您的Set&lt;String&gt; parks 中。如果不是,则抛出异常。

关于汽车(或停车场)的强制可选属性,只需在您的(组合)语法中接受零个或多个参数,并让您的树语法规则返回一个 Vehicle 实例:

/* tree grammar rules! */

vehicle returns [Vehicle v]
  :  car        {$v = $car.v;}
  |  motorcycle {$v = $motorcycle.v;}
  ;

car returns [Vehicle v]
@init{$v = new Car();}
  :  ^(Car ... )
  ;

motorcycle returns [Vehicle v]
@init{$v = new Motorcycle();}
  :  ^(Motorcycle ... )
  ;

Vehicle 可能如下所示:

abstract class Vehicle {

  protected String make;
  protected String color;
  protected int age;
  protected int wheels;

  // ...
}

然后检查是否为每辆车设置了所有强制属性。

如果在尝试自己之后,您无法实现所有这些,我愿意发布一个小演示。在这种情况下,只需添加评论即可。

祝你好运!

【讨论】:

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