2011-09-06 3 views
3

사용자가 속성이있는 일부 객체를 정의 할 수있는 간단한 문법이 있습니다. 예를 들어 :ANTLR - 값의 의미/의미를 확인하십시오.

내가 그 간단한 과제를 확인하는 ANTLR에 대한 문법을 ​​만든
carpark : my carpark 
lots: 100 

car: BMW 
color: red 
wheels: 4 

motocycle 
age: 4 
color: red 

carpark : my second carpark 

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

.

이제 과제의 순서 나 의미를 확인하는 데 문제가 있습니다. 는 어떻게 '내 두 번째 주차장은'이미 존재하는 경우 확인해야 내가 기존 주차장

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

안녕하세요 바트 키어 (Bart Kiers), 두 가지 모두에 대한 귀하의 도움에 감사드립니다. 곧 나는 너에게 돈을 지불해야 할 것이다) 좋아, 이제 내가 왜이 질문을하고 있니? 나는 이것을하는 많은 다른 방법이 있다고 생각합니다.문제는 실제로 적절한 것입니다. 트리 파서에서 이중 정의를 확인하겠다고 했잖아요. 그래서 당신은 트리를 wlaking하고 트리 파서에있는 그 두 개의 정의를 검사하는 자바 코드를 구현할 것인가? 그리고 확장 된 것과 동일한 것 : '기존 가치 필요'용어? 파서가 수행해야하는 작업과 트리 파서가 수행해야하는 작업을 구분하는 것은 어렵습니다. – Alexander

답변

1

당신은 점검을 할 수 파서 문법에는 유효한 슈퍼 파크 (extends ...)가 있지만 트리 문법은 복잡하지 않은 문법입니다. 그래서 거기에 그런 것들을하고 싶습니다.

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가 통과하는 동안 다음에 String의 추가 :

은 당신이 할 수있는 당신의 나무 워커의 구성원으로 Set<String> parks을 만드는 것입니다. 그런 다음 extends VALUE에 비틀 거 렸을 때 Set<String> parksVALUE.text이 있는지 확인하는 맞춤 코드를 추가합니다. 그렇지 않은 경우 예외를 throw합니다.

/* 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 ...) 
    ; 

A : 옵션 자동차의 특성 (또는 자동차 공원)이, 단순히 (결합) 문법에 0 개 이상의 매개 변수를 수락하고 트리 문법 규칙을 할 필수 정보

Vehicle 인스턴스를 반환 Vehicle처럼 보일 수 있습니다 :

abstract class Vehicle { 

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

    // ... 
} 

그리고 모든 필수 속성이 설정되어있는 경우 각 차량 여부를 확인.

자신을 시험해 본 후에도이 모든 것을 구현하는 데 문제가있는 경우 약간의 데모를 게시 해 드리겠습니다. 이 경우 주석을 추가하십시오.

행운을 빈다.