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