필자가 작성중인 컴파일러에 대해 AST를 작성하기 위해 Bison과 협력 중입니다. AST에서 노드를 구축하는 가장 좋은 방법은 무엇입니까? 예를 들어 제 질문이 더 명확해질 수 있습니다. 다음 코드 감안할 때Bison을 사용하여 AST 작성하기
: I 필드 규칙이 필드 노드를 반환 할 위의 예에서
field
: modifier type TOK_IDENT TOK_SEMICOLON
{
// I want to return a pointer to a node of type Field
// i.e. $$ = new Field(name, isVisible, isStatic, type);
}
;
modifier
: visibility_opt static_opt
{
// Should I make the new Field here and pass it up?
// Or a new type that contains both vis and static options?
}
;
visibility_opt
: /* default */ { $$ = true; }
| TOK_PUBLIC { $$ = true; }
| TOK_PRIVATE { $$ = false; }
;
static_opt
: /* default */ { $$ = false; }
| TOK_STATIC { $$ = true; }
;
,하지만 난 구문 분석 중에 전달됩니다 수식 규칙의 일부 속성이 필요합니다 (즉 이들은 합성 된 속성이다).
문법을 변경하지 않고이 작업을 수행 할 수있는 두 가지 방법이 있다고 생각할 수 있습니다.
- 비 종단 수식어가 Field 유형을 갖고 여기에 새 Field를 작성하고, 할 수있는 것을 채우고, 나머지 수를 채우기 위해 필드로 전달하십시오.
- 수정 자에 두 개의 bool 값을 보유하는 고유 한 유형이 있고 필드 규칙에서 새 필드를 작성할 때 데이터를 추출하여 전달하십시오.
이런 상황에서 가장 좋은 방법은 무엇입니까?
나는 대체적으로 두 가지로 갈 것입니다. 주로'modifier '는 실제로'field'가 아니기 때문에 별도의 것입니다. –
그래, 수정 자에 std :: pair 유형을 부여하기 위해 두 번째 방법을 선택했습니다. 그것은 비록 다른 경우에 그것은 첫 번째 접근법과 함께가는 것이 더 합리적 이었기 때문에 그것이 의존하는 것처럼 보입니다 ... –
mcorley