Я использую утилиты fslex / fsyacc для моего F # Lexer и Parser. Если вводимый текст имеет неверный синтаксис, необходимо знать, где это происходит.
В лексере можно определить неверную лексему (токен) и выбросить исключение, если был использован неверный символ или слово:
rule token = parse
...
| integer { INT (Int32.Parse(lexeme lexbuf)) }
| "*=" { failwith "Incorrect symbol" }
| eof { EOF }
Вопрос больше относится к Parser (fsyacc) - если входной текст имеет правильные токены и был успешно токенизируется Lexer, но во время синтаксического анализа произошла ошибка (например, неправильный порядок токенов или какой-то отсутствующий токен в правиле)
Я знаю, поймал ли исключение, это дает позицию (строка и столбец), где анализ не удался:
try
Parser.start Lexer.token lexbuf
with e ->
let pos = lexbuf.EndPos
let line = pos.Line
let column = pos.Column
let message = e.Message // "parse error"
...
Но возможно (если да - как это сделать?) определить также класс AST, для которого анализ не удался .
Например, можно ли в моем файле parser.fsy написать что-то похожее на следующее:
Expression1:
| INT { Int $1 }
...
| _ { failwith "Error with parsing in Expression1"}