2016-11-11 6 views
3

Lexer는 렉싱 중에 대괄호를 구별하고 열린 대괄호 스택을 유지하기로되어 있습니다. 이를 위해 나는이처럼 내 FSL 파일에 도우미 함수를 지정 :'{'에 구문 오류가있는 FsLex가 중단됩니다.

let updateBracketStack sign = // whenever a bracket is parsed, update the stack accordingly 
    match sign with 
    | '[' -> push sign 
    | '{' -> push sign 
    | ']' -> if top() = '[' then pop() else() 
    | '}' -> if top() = '{' then pop() else() 
    | _ ->() 

과정의 스택 문자리스트의 심판이다. 그리고 push, top, pop은 그에 따라 구현됩니다.

문제는 내가 { 문자를 추가 할 때까지 모든 것이 작동한다는 것입니다. 이제 FsLex는 error: parse error

으로 변경합니다. 즉, "{"을 쓰면 FsLex가 다시 잘됩니다. 따라서 문자 대신 문자열 대신 스택을 구현하면 문제가 해결됩니다.

그러나 내 질문에이 동작은 어디서 발생합니까? FsLex라면 버그입니까?

+1

당신이 게시 한 코드는 '정상을()'가의가 비교되는 및 결과''[ ''하나 개의 일치 분기 (숯불), 그리고' "{"'(문자열) 다른 일치 지점에서 컴파일하면 안된다! 'top()'의 리턴 타입은'char' 또는'string'이 될 수 있지만, 어느 쪽이든, F # 컴파일러는 두 개의 브랜치 중 하나에서 타입 에러를 제공해야합니다. 이 질문에 대한 코드를 붙여 넣기에 복사하여 붙여 넣기 오류가 발생하지 않았습니까? – rmunn

+0

오타가 수정되었습니다. 그러나 이것은 질문과 관련이 없습니다. 컴파일하지 않는 F # 컴파일러는 아니지만 fslex는 입력을 받아들이고 F # 코드를 생성하지 못합니다. –

답변

0

FsLex의 파서는 FsLexYacc를 사용하여 생성됩니다. "구문 분석 오류"메시지는 오류 위치가 성공하지만 해당 위치에서 구문 분석이 실패 할 때까지 (.fsl 파일의) 렉싱을 의미합니다. 근본 원인을 찾으려면 전체 입력 텍스트를 FsLex에 게시해야합니다.

이것은 추측에 불과합니다. 임베디드 코드 블록에 대한 오픈 토큰이기 때문에 FsLex는 '{'문자로 혼동 될 수 있습니까? 또는 입력 텍스트에 특수 유니 코드 문자가 포함되어 있지만 편집기에서 공백으로 보입니까?

하나의 가능한 해결 방법은 LexHelper.fs에 다른 모듈과 .fs 파일, LexHelper 모듈을 만들고 그 안에 도우미 기능을 배치하고 .fsl 파일에서 여는 것입니다.

편집

FsLexYacc의 소스 코드를 보면, 그것은} 포함 된 F # 코드에서 작은 따옴표로 둘러싸인 문자를 처리하지 않고, 큰 따옴표로 둘러싸인 않을 때.

https://github.com/fsprojects/FsLexYacc/blob/master/src/FsLex/fslexlex.fsl

관련 문제