2012-02-08 2 views
0

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"으로 봅니다.

내가 뭘 잘못하고 있니?

+0

당신은'[^ {} \ n] + 무엇이든 돌려 보았습니까? ' – wildplasser

+0

그 중 하나는 작동하지만 텍스트를 "줄"로 분리하는 원래의 생각은 필드에 비 EOL 문자를 허용하는 것이 었습니다. – mistotebe

+1

그럼 네가'{}'를 먹을거야, 안 그래? 렉스는 욕심이 많다. 두 패턴이 현재 입력과 일치하면 가장 긴 매치가 승리한다. – wildplasser

답변

3
[{}] return *yytext; 
[^{}\n]+ return ANYTHING; 
\n  return EOL; 

렉스는 욕심이 많습니다. 두 패턴이 현재 입력과 일치하면 가장 길게 일치합니다. 원래의 렉스 조각에서 [^\n]+ 패턴은 { 또는 }의 줄을 찾습니다.

+0

예, 하나의 해결책입니다. ANYTHING이 다른 어휘들과 충돌하지 않도록 제한하고 (ANYTHING_) 거기에 모든 것을 어셈블하는 비 터미널 규칙 ANYTHING_을 추가합니다 ... 어휘 자 상태를 설정할 가능성이 없습니까? 올바른 장소에서만 트리거되는 하나의 'ANYTHING' 어휘를 충분히 신뢰할 수 있습니까? – mistotebe

+0

무슨 뜻인지 이해가 안됩니다. 어떤 것도 \ n과 {}를 제외한 다른 것과 일치 시키길 원한다면 부정 된 문자 클래스가 길이다 (무엇이 잘못 되었는가?). {}을 (예 : 문자열이나 주석으로) 보존하려면 시작 조건이 필요할 것입니다. (또는 렉서를 수동으로 생성하는 것은 충분히 간단하기 때문에) – wildplasser

+0

이것은 [this] (http://mistotebe.net/image/grammar.txt)의 조각 일 뿐이며, 다른 어휘와 ANYTHING 토큰을 지정하는 방법이 있습니다 아주 지루할 것이다. 시작 조건은 무엇입니까? – mistotebe