양수와 음수를 구문 분석하려고합니다. LALR 문법에서 시프트 감소 충돌을 극복하는 방법
number(N) ::= pnumber(N1).
number(N) ::= nnumber(N1).
number(N) ::= pnumber(N1) DOT pnumber(N2).
number(N) ::= nnumber(N1) DOT pnumber(N2).
pnumber(N) ::= NUMBER(N1).
nnumber(N) ::= MINUS NUMBER(N1).
처음 두 규칙의 포함
는 이동/줄일 충돌을 제공하지만 난 충돌이 발생 결코 문법은 쓸 수있는 방법을 모르겠어요. 레몬 파서를 사용하고 있습니다.편집 :이 .out 파일에서 충돌이
State 79:
(56) number ::= nnumber *
number ::= nnumber * DOT pnumber
DOT shift 39
DOT reduce 56 ** Parsing conflict **
{default} reduce 56 number ::= nnumber
State 80:
(55) number ::= pnumber *
number ::= pnumber * DOT pnumber
DOT shift 40
DOT reduce 55 ** Parsing conflict **
{default} reduce 55 number ::= pnumber
State 39:
number ::= nnumber DOT * pnumber
pnumber ::= * NUMBER
NUMBER shift-reduce 59 pnumber ::= NUMBER
pnumber shift-reduce 58 number ::= nnumber DOT pnumber
State 40:
number ::= pnumber DOT * pnumber
pnumber ::= * NUMBER
NUMBER shift-reduce 59 pnumber ::= NUMBER
pnumber shift-reduce 57 number ::= pnumber DOT pnumber
편집 2 : 최소한의 문법 문제
start ::= prog.
prog ::= rule.
rule ::= REVERSE_IMPLICATION body DOT.
body ::= bodydef.
body ::= body CONJUNCTION bodydef.
bodydef ::= literal.
literal ::= variable.
variable ::= number.
number ::= pnumber.
number ::= nnumber.
number ::= pnumber DOT pnumber.
number ::= nnumber DOT pnumber.
pnumber ::= NUMBER.
nnumber ::= MINUS NUMBER.
MCVE ([MCVE])를 생산하십시오. '(N) '라벨을 삭제하면 (사용되지 않음), 주어진 조각은 SQLite 3.14.0에서 레몬과의 시프트 감소 충돌을 일으키지 않습니다. 최소한 .out 파일을보고 관련 충돌 정보를 질문에 포함해야하지만, 복사하여 문제를 재현 할 수있는 문법 단편을 생성하는 것이 가장 좋습니다. 그럼 우린 너를 도울 수있어. 그때까지, 우리는 붙어 있습니다. –
@JonathanLeffler 충돌이 발생한 곳의 .out 파일의 출력을 추가했습니다. (N) 라벨이 실제로 사용되었지만 간결함을 위해 질문에서 삭제했습니다. –
물론 라벨은 실제 문법에 사용됩니다.하지만 도움이 될 때 귀찮을 수 있습니다. 코드의 MCVE 화 작업을해야합니다. 39와 40 로의 전환은 관련이 있습니다. 그러나 우리는 그 규칙이 어떤 규칙인지는 알지 못합니다. 문제는 문법이 두 가지 토큰을 미리 살펴 봐야한다는 것입니다. 이것이 문제인 경우, 어휘 분석기를 향상 시켜서 문법보다는 소수점을 처리하여 다른 토큰 (예 : NUMBER, 지금은 DECIMAL)을 반환해야합니다. 선행 0은 DOT 이후 중요합니다. –