현재 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
| ...
당신은 더 많은 문법을 보여줄 필요가 있습니다. 또는 더 나은 경우에도 동일한 문제가 있지만 반복적으로 제작할 수있는 컴파일 가능한 문법을 만들 수 있습니다. 그런데,'argument_list' 문법은 매우 이상합니다. LALR (1) 파서에서 일반적으로 피해야하는 왼쪽 재귀를 사용하여 작성하는 것이 유용한 이유는 무엇입니까? 여러 개의 누락 된 인수는 무엇을 의미합니까? 그리고 다른 모든 주장을 생략 할 수 있다면, 왜 마지막 문장을 쓸 수 없습니까? – rici
하나의 인수를 취하는 함수를 괄호없이 호출 할 수있는 VB 구문을 허용합니까? 그렇다면 귀하의 문제 일 가능성이 높습니다. – rici
@rici ** missing arguments ** :이 특정 VB 언어에서는 인수 목록에 빈 인수가 있습니다. 마지막 인수는 예외입니다. _Expression_이 비어 있기를 정말로 원하지 않기 때문에 _ArgumentList_에 3 번째 규칙을 추가했습니다. ** 괄호없이 하나의 인수 ** : 예! 사실 어제 근본 원인을 찾기 위해 깊이 잠수를 시도한 후, 이것이 원인 일 수 있다는 결론에 도달했습니다. 이 구문을 포함시키는 방법에 대한 제안이 있습니까? –