2011-09-06 86 views
3

我有一个简单的语法,它允许用户定义一些具有属性的对象。 例如:ANTLR - 检查语义/值的含义

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! 
    ; 

但后来强制性的属性可以不被定义。 我可以添加喜欢mandatoryattributedefinition额外的规则,但那么就很难允许以任何顺序定义

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

+0

嘿巴特基尔斯,首先感谢您的帮助,在这两个线程!很快,我必须支付你;) 好吧,现在我为什么问这个问题? 我认为有很多不同的方法来做到这一点。问题是真正的问题。你说过你会在树解析器中检查双重定义。所以你应该在树上执行一些java代码并检查树分析器中的那些双重定义?延伸的同样的东西:“现有价值需要”的术语? 对于我来说,解析器应该做的事情和树解析器应该做的事情之间很难分开。 – Alexander

回答

1

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

你可以做的是创造一个Set<String> parks为您的树遍历的成员:

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 

,然后添加String s到它,而AST遍历。然后,当您偶然发现extends VALUE时,您会添加一些自定义代码,检查您的Set<String> parks中是否存在VALUE.text。如果不是,则抛出异常。

关于强制汽车的可选属性(或停车场内),简单地接受零个或多个参数的(组合)的语法,让你的树语法规则返回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; 

    // ... 
} 

,然后检查每辆车如果所有的强制属性已设置。

如果在尝试过自己之后遇到了麻烦,我愿意发布一个小小的演示。在这种情况下只需添加评论。

祝你好运!