Jison (Bison)을 사용하여 간단한 마크 업 언어를 작성하고 있습니다. 나는 이것에 대해 명확하게 새롭지 만, 약간의 변형이 잘 작동하고있다. 나는 단지 S/R 갈등의 원인을 이해하지 못한다.문법 스펙 해결 Shift/충돌 감소
두 개의 렉서 동작 (시작 조건이 다름)이 '텍스트'를 반환하지 않아 문법에 규칙이 적게 들거나 사용자에게 표시되는 오류 메시지가 일관된. 컨텍스트에 상관없이 '텍스트'규칙을 일반화하려고 시도했지만 각 토큰에 다른 이름을 부여하려고했지만 S/R 충돌에 영향을 미치지 않습니다.
일반 텍스트, 하위 배열 및 다양한 특수 노드가있는 json 개체를 만들려면 구문 분석기가 지원됩니다.
사양 :
/* lexical grammar */
%lex
%s bracketed
%%
<bracketed>(\\.|[^\\\,\[\]])+ { yytext = yytext.replace(/\\(.)/g, '$1'); return 'Text'; }
<INITIAL>(\\.|[^\\\[])+ { yytext = yytext.replace(/\\(.)/g, '$1'); return 'Text'; }
"[" { this.begin('bracketed'); return '['; }
"]" { this.popState(); return ']'; }
"," return ','
<<EOF>> return 'END'
/lex
%start template
%%
template
: sentence END
;
sentence
: /* empty */
| sentence Text
| sentence '[' ']'
| sentence '[' dynamic ']'
;
dynamic
: sentence
/*| dynamic ',' sentence*/
;
경고 :
Conflict in grammar: multiple actions possible when lookahead token is ] in state 5
- reduce by rule: sentence ->
- shift token (then go to state 6)
States with conflicts:
State 5
sentence -> sentence [ .] #lookaheads= END Text [ ]
sentence -> sentence [ .dynamic ] #lookaheads= END Text [ ]
dynamic -> .sentence #lookaheads= ]
sentence -> . #lookaheads= ] Text [
sentence -> .sentence Text
sentence -> .sentence [ ]
sentence -> .sentence [ dynamic ]
다른 생성 알고리즘은 다소 문제가 있지만, 그들은 모두 문제가있는 것 같다.
감사합니다.
좋은 답변입니다. 그리고 나는 당신이 추가 한 제안을 좋아합니다 - 그 생각을하지 않은 그러한 행동들에서 더 큰 처리에 내 마음을 열었습니다. 나는 여전히 모든 일을 할 수 있도록 노력하고 있습니다. 규칙의 출현 순서가 중요합니까? –
당신은 또한 그 조치가 분쟁 해결 논의에 실제로 필요하지 않다는 것을 깨닫도록 도왔습니다. –
문법을 업데이트했습니다. 아직 볼 수 없습니다. –