Почему в сканере 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, поэтому я не могу объяснить неопределенную ошибку символа.
Возможно, вы захотите сделать начальные +/- необязательными для ваших целых чисел. По вашему определению один из них обязателен.