Почему в сканере OCaml регулярное выражение для отрицательных целых чисел не работает?

У меня есть следующий код ocamllex:

let flt = ['-' '+']?['0'-'9']+ ['.'] ['0'-'9']+
rule token = parse
  [' ' '\t' '\r' '\n']      { token lexbuf } (* Whitespace *)
| ['0'-'9']+ as lxm         { INTEGER(int_of_string lxm) }
| flt as lxm    { FLOAT(float_of_string lxm) }

Это работает!

Но в ту минуту, когда я хочу разрешить знаки + и - для INTEGER, это дает мне ошибку.

let flt = ['-' '+']?['0'-'9']+ ['.'] ['0'-'9']+
rule token = parse
  [' ' '\t' '\r' '\n']      { token lexbuf } (* Whitespace *)
| ['+' '-']['0'-'9']+ as lxm        { INTEGER(int_of_string lxm) }
| flt as lxm    { FLOAT(float_of_string lxm) }

Ошибка заключается в следующем:

Fatal error: exception Failure("int_of_string")
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64

Самое смешное, что в моем файле.ml я использую "float_of_string", но я нигде не использую "int_of_string".

2 ответа

int_of_string не справляется с ведущими + знаки, так что вы должны вынуть это, прежде чем передать свою строку int_of_string,

Регулярное выражение работает нормально, это ваш призыв к int_of_string это терпит неудачу. Ты используешь int_of_string, Посмотрите на четвертую строку любого куска кода.

sepp2k объясняет, почему вы получаете исключение.

Я не понимаю, как вы можете запустить свою программу без main, поэтому я не могу объяснить неопределенную ошибку символа.

Возможно, вы захотите сделать начальные +/- необязательными для ваших целых чисел. По вашему определению один из них обязателен.

Другие вопросы по тегам