PLY에 문제가있는 동안 동일한 들었던 문법 조각을 들소에서 시험해보고 비슷한 문제가 발생했습니다. 이것은 내가 뭔가 잘못하고있을 수도 있음을 암시합니다. 문법 결정론잘못된 토큰을 매치하는 Bison
multiline: '{' EOL lines EOL multiline '}'
|
;
lines: lines ANYTHING EOL
|
;
:
document -> fragment?
fragment -> { \n line* \n fragment? }
line -> [^\n]+ \n
관련 렉스 라인 :
[{}] return *yytext;
[^\n]+ return ANYTHING;
\n return EOL;
관련 들소 라인
문법 단편의 상징적 표현은 다음과 같다 왜냐하면 내가 아는 모든 것은 심지어 LALR (1)이어야하기 때문입니다 (실제로는 테이블을 만들려고 시도하지 않았습니다). "{\n\n}"
과 같은 문서는 구문 분석하지만 multiline
요소가 중첩 된 문서 (예 : "{\n\n{\n\n}}"
)가 아닌 경우 렉서는 '}'
이 아닌 "}}"
의 마지막 부분을 토큰 "ANYTHING"
으로 봅니다.
내가 뭘 잘못하고 있니?
당신은'[^ {} \ n] + 무엇이든 돌려 보았습니까? ' – wildplasser
그 중 하나는 작동하지만 텍스트를 "줄"로 분리하는 원래의 생각은 필드에 비 EOL 문자를 허용하는 것이 었습니다. – mistotebe
그럼 네가'{}'를 먹을거야, 안 그래? 렉스는 욕심이 많다. 두 패턴이 현재 입력과 일치하면 가장 긴 매치가 승리한다. – wildplasser