2017-02-23 11 views
0

현재 LALR (1) 문법과 같은 Visual Basic을 작성하고 있으며이를 올바르게 해결하는 방법을 모르는 특정 이동/축소 충돌에 직면합니다.괄호로 인한 LALR (1) 충돌을 이동/줄이기

문법의 문제 부분 (해명 EDIT 1편집 2 참조)은 다음과 같습니다

State 109 
    237 ParenthesizedExpression: '(' Expression ')' . 
    $default reduce using rule 237 (ParenthesizedExpression) 

... 
State 295 

    231 IndexExpression: MemberExpression '(' . ArgumentList ')' 
    237 ParenthesizedExpression: '(' . Expression ')' 
    ... 
    Expression go to state 352 

... 
State 352 
    182 ArgumentList: Expression . 
    183    | Expression . ',' ArgumentList 
    237 ParenthesizedExpression: '(' Expression . ')' 
    ... 
    ')' shift, and go to state 109 

    ')' [reduce using rule 182 (ArgumentList)] 

:

Expression 
    : IndexExpression 
    | /* other expressions */ 

IndexExpression 
    : MemberExpression 
    | MemberExpression '(' ArgumentList ')' 

MemberExpression 
    : ParenthesizedExpression 
    | Identifier 

ParenthesizedExpression 
    : '(' Expression ')' 

ArgumentList 
    : Expression 
    | Expression ',' ArgumentList 
    | ',' ArgumentList 

그리고 변화/충돌을 감소하는 것은 이것이다 즉, 파서는 ArgumentList 하나의 expre이든 괄호로 묶인 표현식을 마주 할 때 확실하지 않습니다. 또는 괄호 안의 표현.

문법을 LALR (1)로 유지하면서이 충돌을 수정할 방법이 있습니까?

감사합니다.

편집 1 :

/* 다른 표현은 */ 실제로 빈 표현하지 표현에, 난 그냥 간결에 대한 이러한 방법으로 그것을 썼다. 실제로는 다른 대안적인 표현이 있습니다

Expression 
    : IndexExpression 
    | Expression '+' Expression 
    | ... 

편집 2 : 여기

@rici이 문제가 될 수있는 지적 문법 (성명 특히 1 오른손 법칙의 추가 부품은) : Expression 때문에 주석 규칙 /* other expressions */의, 비어있을 수 있기 때문에

Statement 
    : MemberExpression ArgumentList 
    | MemberExpression '=' Expression 
    | MemberExpression '(' ArgumentList ')' '=' Expression 
    | ... 
+0

당신은 더 많은 문법을 보여줄 필요가 있습니다. 또는 더 나은 경우에도 동일한 문제가 있지만 반복적으로 제작할 수있는 컴파일 가능한 문법을 ​​만들 수 있습니다. 그런데,'argument_list' 문법은 매우 이상합니다. LALR (1) 파서에서 일반적으로 피해야하는 왼쪽 재귀를 사용하여 작성하는 것이 유용한 이유는 무엇입니까? 여러 개의 누락 된 인수는 무엇을 의미합니까? 그리고 다른 모든 주장을 생략 할 수 있다면, 왜 마지막 문장을 쓸 수 없습니까? – rici

+1

하나의 인수를 취하는 함수를 괄호없이 호출 할 수있는 VB 구문을 허용합니까? 그렇다면 귀하의 문제 일 가능성이 높습니다. – rici

+0

@rici ** missing arguments ** :이 특정 VB 언어에서는 인수 목록에 빈 인수가 있습니다. 마지막 인수는 예외입니다. _Expression_이 비어 있기를 정말로 원하지 않기 때문에 _ArgumentList_에 3 번째 규칙을 추가했습니다. ** 괄호없이 하나의 인수 ** : 예! 사실 어제 근본 원인을 찾기 위해 깊이 잠수를 시도한 후, 이것이 원인 일 수 있다는 결론에 도달했습니다. 이 구문을 포함시키는 방법에 대한 제안이 있습니까? –

답변

2

오류는 있습니다 nd는 비어 있지 않은 것으로 가정합니다.

동일한 두 규칙 Expression 결과를 사용하는 다음 방송

: 시프트

ArgumentList 
    : Expression 
    | Expression ',' ArgumentList /* degenerates into "',' ArgumentList" */ 
    | ',' ArgumentList 
    ; 

수가/충돌을 감소는 참조 시간 ArgumentList 수가 ArgumentList 두번 IndexExpression 번 (사용하고있는 자체)

충돌을 제거하거나 빈 Expression의 경우에 ArgumentList를 해결하려면 :

ArgumentList 
    : Expression 
    | ArgumentList ',' Expression 
    ; 

또는 Expression이 비어 있지 않은지 확인하십시오 (주석 된 규칙 삭제).

+0

안녕하세요, kdhp, 제 편집 1을 참조하십시오. 원래 게시물에 모호한 것에 대해 유감스럽게 생각합니다. –

+1

@SamTatasurya 표현식 목록을 보지 않고서는 다른 빈 값이 있거나 연산자가'% left' /'% right'로 선언되지 않았거나' '('Expression ')에 대한 두 번째 규칙이 있다고 추측 할 수 있습니다.) ''(또한'IndexExpression-> MemeberExpression-> ParenthesizedExpression'을 통해 나타납니다) – kdhp