1

我正在尝试用 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());

但问题是它只检测从新行开始的整数和实数。我试图放弃(^ | " "+)start ,^但随后 ml-lex 给出了 error ml-lex: syntax error, line 15: unhandled exception: Error。我可以进行哪些更改来检测“我有 5 本书”之类的句子之间的整数和实数。并且程序应该忽略所有字符并且应该只检测整数 5。

我还有一个问题。我想我已经为实数定义了正则表达式,它应该说,只有当数字在 .(点)之后只有一个零或从 0-9 的某个数字序列但不以零结尾时,某些东西才是真实的。但我的程序也将 5.00 和 5.600 检测为实数。

4

1 回答 1

2

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

" " => (lex());

这样,空白会被静默地跳过。如果您想跳过所有字母,您可以error在规则中删除对 的调用.

我认为您的程序将 5.600 检测为实数没有问题,因为它具有小数部分。要强制将 5.000 作为整数进行词法分析,您可以在当前返回的规则的 RHS 中进行额外的测试REAL

于 2012-02-08T22:03:50.080 回答