Обнаружение слов в мл-лекс.(Регулярное выражение) - PullRequest
1 голос
/ 08 февраля 2012

Я пытаюсь написать программу в ml-lex, которая будет определять целые и действительные числа. Моя программа выглядит примерно так:

datatype lexresult = INTEGER of string | REAL of string | EOF
val linenum = ref 1;
val error = fn x => output(stdOut,x^"\n");
val eof = fn () => EOF;
fun inc(j) = j := !(j) + 1;
%%
%structure Something
num=[1-9];
zero=[0];
%%
\n => (inc linenum; lex());
^({num}+)({num}* | {zero}*)* => (INTEGER yytext);
^({num}+)({num}* | {zero}*)*(".")({zero} | ({zero}* | {num}+)) => (REAL yytext);
. => (error ("ignoring bad character "^yytext); lex());

Но проблема в том, что он обнаруживает только целые и действительные числа, начинающиеся с новой строки. Я попытался дать (^ | " "+) в начале вместо ^, но затем ml-lex выдает ошибку ml-lex: syntax error, line 15: unhandled exception: Error. Какие изменения я могу внести, чтобы обнаружить целые и действительные числа между предложениями типа «У меня есть 5 книг». и программа должна игнорировать все символы и должна определять только целое число 5.

У меня также есть еще одна проблема. Я думаю, что я определил регулярное выражение для действительного числа, что-то вроде этого, оно должно сказать, что что-то реально, только если число имеет только один ноль после . (точка) или некоторая последовательность чисел от 0-9, но не заканчивается на нуль. Но моя программа также обнаруживает 5.00 и 5.600 как действительные числа.

1 Ответ

2 голосов
/ 09 февраля 2012

Я не знаю mllex, но я немного поиграл с GNU Flex и ocamllex. Что я хотел бы сделать, это добавить правило, как это:

" " => (lex());

Таким образом, пробел молча пропускается. Если вы хотите пропустить все буквы, вы можете удалить вызов на error в вашем правиле для ..

Я не вижу проблем в том, что ваша программа распознает 5.600 как действительное число, поскольку оно имеет десятичную составляющую. Чтобы заставить 5000 быть лексированным как целое число, вы можете выполнить дополнительные тесты в RHS вашего правила, которое в настоящее время возвращает REAL.

...