2012-02-08 8 views
1

私は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を実数として検出しています。

答えて

2

私はmllexを知らないが、私はGNU Flexとocamllexで少しプレイした。私は何だろうが、このようなルールを追加です:

" " => (lex()); 

そのように、空白は黙ってスキップされます。すべての文字をスキップする場合は、.のルールでerrorへの呼び出しを削除できます。

5.600が小数成分を持つため、実数としてプログラムを検出しても問題はありません。 5.000を整数としてレキシングするには、現在REALを返すルールのRHSで追加のテストを実行できます。

関連する問題