Как обрабатывать ошибки во время синтаксического анализа в F #

Я использую утилиты 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"}
9
задан Abel 10 March 2011 в 21:29
поделиться