2016-06-18 3 views
0

해결 전환은/들소

method_call: T_ID T_LPAREN method_arg_list T_RPAREN T_SEMICOLON 

value: T_ID T_LSB expr T_RSB 
    | T_ID; 

method_arg_list: /* Empty */ 
       | method_arg method_arg_list; 

method_arg: string_constant 
      | expr; 

expr: value 
    | '(' expr ')'; 

에 따라함에 따라 충돌이 문법에 충돌을 감소 문제는이 T_ID을 읽을 때, 그것은 이동 및 다음 '을 읽어야 여부를 알 수 없다는 것입니다 ('또는 값을 줄입니다. 그러나 다음 토큰이 왼쪽 괄호인지 확인하면 안됩니다.)

나는 바이슨과 파서가 일반적으로 새롭기 때문에 내가 어떻게 다시 작성할 수 있는지 궁금하다. 문법과 충돌을 해결할 수 있습니까?

State 60 

37 method_call: T_ID . T_LPAREN method_arg_list T_RPAREN T_SEMICOLON 
67 value: T_ID . T_LSB expr T_RSB 
68  | T_ID . 

T_LPAREN shift, and go to state 71 
T_LSB  shift, and go to state 72 

T_LPAREN [reduce using rule 68 (value)] 
$default reduce using rule 68 (value) 
+0

Google에서 귀하를 도울 수있는 정보가 충분하지 않습니다. 오류를 재현하는 MCVE ([MCVE])를 생성해야합니다. 일부 토큰을 나열합니다 (실제 문법에서는 비 터미널 임에도 불구하고 일부 비 터미널을 토큰으로 나열 할 수 있습니다). 'yacc -v' ('bison -v')의 출력에서 ​​문제가있는 상태에 대한 shift/reduce 충돌 보고서를 보여줍니다. 문제를 재현 할 수있을만큼 충분한 문법이 필요합니다. 그러나 문제를 재현 할 수있을만큼 충분하지는 않습니다. –

+0

@JonathanLeffler 내가 몇 가지를 변경 한 후에 오류가 사라졌다 ... 나는 아직도 무슨 일이 있었는지 알아 내려고 노력 중이다. – GalaxyVintage

+0

''(''은'T_LPAREN'과'')이어야하는지 잘 모르겠다. '는'T_RPAREN'이어야합니다. 쓰여진 것처럼'% token T_ID T_LPAREN T_RPAREN T_SEMICOLON T_LSB T_RSB string_constant' 그리고 Bison은 코드에서 괜찮습니다. 나는 당신이 파산 한 것을 기록하고 그 후에 작동하는 것을 희망합니다. 버전 제어 시스템을 사용하는 것이 매우 중요합니다. –

답변

0

레플러가 올바른지 편집 : 우리는 메소드 호출과 값과 같은 의존 수있는 몇 가지 더 높은 수준의 sentential 구조에 대해 알 필요가있다.

나는 개념적 관점에서 어떤 일이 벌어지는 지 알 수 있습니다. "y.output"성격에 빠져있을 필요가 없습니다. 모든 것은 쉼표로 메소드 호출에 대한 인수를 분리하지 못했기 때문에 발생합니다. 또한, 왜 당신이 왼쪽 - 재귀 적으로보다는 재귀 적으로 당신의 인수 목록을 수집하는지 알고 싶습니다.

'('및 T_LPAREN 사이 및 ')'과 T_RPAREN의 차이점은 무엇입니까? 렉스가 하나의 경우에 하나를 반환하고 다른 경우에는 렉스를 반환합니까? 그것은 단순한 패턴 \ (이 둘 모두에 맵핑 될 수는 없지만 하나에만 맵핑 될 수 있으며, 패턴 \에 대해서도 동일합니다). 또한 가독성을 위해 예를 들어, '['는 잘 수행 할 수 있습니다.