检测ml-lex中的单词。 (正则表达式)

时间:2012-02-08 15:58:19

标签: regex lex sml smlnj

我正在尝试用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之间的某个数字序列但是没有#39时,某些事情才是真实的。 ; t结束为零。但我的程序还检测到5.00和5.600为实数。

1 个答案:

答案 0 :(得分:2)

我不知道mllex,但我在GNU Flex和ocamllex上玩过一点。我要做的是添加这样的规则:

" " => (lex());

这样,就会默默地跳过空格。如果您想跳过所有字母,可以删除error规则中.的号召。

我认为您的程序检测5.600为实数没有问题,因为它有一个十进制组件。要强制5.000作为整数被列为lexed,您可以在当前返回REAL的规则的RHS中执行其他测试。