私はml-lexで整数と実数を検出するプログラムを書こうとしています。私のプログラムは次のようなものです: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のみを検出する必要があります。
もう1つ問題があります。実際の数字の正規表現は、数字が.
(ドット)の後に1つのみ、またはゼロから9までの数字のシーケンスが0に終わらない場合にのみ実際のものであると言わなければならないと定義していると思います。しかし私のプログラムでは5.00と5.600を実数として検出しています。