求一配对算法如何检错,集思广益

xiaowei_001 2014-06-26 01:59:27
如:begin与end需配对使用,
begin
begin

end
end
begin
end
如何检查出是否配对正确,错误情形很多,
1、缺少end与之配对
begin
//end
2、缺少begin与之配对
//begin
end
3、多end或者多begin
begin
begin
end
end
end
类似这些错误,如何检查出这些错误呢
...全文
161 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaowei_001 2014-06-28
  • 打赏
  • 举报
回复
结贴给分.exe
xiaowei_001 2014-06-28
  • 打赏
  • 举报
回复
引用 15 楼 kiboisme 的回复:
[quote=引用 9 楼 yyfhz 的回复:] [quote=引用 3 楼 wr960204 的回复:] 最基本的,一个栈,遇到Begin压栈,遇到end弹栈.
差不多吧,当栈里面没有东西还要popup就报错,更简单的可以用一个变量 i:=0; while file is not EOF do begin read next word; if next word is 'begin' then i:=i+1; if next word is 'end' then i:= i-1; if i<0 then raise error end; 麻烦的倒是要先清注释,再清掉字符串常量[/quote] 最后再加一个判断, if i>0 then //begin太多[/quote] 是的,问题基本解决了
haitao 2014-06-27
  • 打赏
  • 举报
回复
引用 7 楼 xiaowei_001 的回复:
[quote=引用 6 楼 sz_haitao 的回复:] 还要考虑 字符串、注释 里的begin/end
这个不用考虑的,代码是生成,不会有注释[/quote] 代码是生成? 那就好办了,每个begin/end后增加一套 {guid} 包好!
xiaowei_001 2014-06-27
  • 打赏
  • 举报
回复
引用 12 楼 yyfhz 的回复:
[quote=引用 10 楼 xiaowei_001 的回复:] [quote=引用 9 楼 yyfhz 的回复:] [quote=引用 3 楼 wr960204 的回复:] 最基本的,一个栈,遇到Begin压栈,遇到end弹栈.
差不多吧,当栈里面没有东西还要popup就报错,更简单的可以用一个变量 i:=0; while file is not EOF do begin read next word; if next word is 'begin' then i:=i+1; if next word is 'end' then i:= i-1; if i<0 then raise error end; 麻烦的倒是要先清注释,再清掉字符串常量[/quote] 这样还是有问题吧,如 begin end end end end begin begin begin 检测不出来的,应该是楼上说的就近原则,最近的begin配最近的end,程序用什么算法好实现呢?[/quote] 它在第2个end的地方i就小于0了,然后直接raise error[/quote]
蓝色光芒 2014-06-27
  • 打赏
  • 举报
回复
引用 9 楼 yyfhz 的回复:
[quote=引用 3 楼 wr960204 的回复:] 最基本的,一个栈,遇到Begin压栈,遇到end弹栈.
差不多吧,当栈里面没有东西还要popup就报错,更简单的可以用一个变量 i:=0; while file is not EOF do begin read next word; if next word is 'begin' then i:=i+1; if next word is 'end' then i:= i-1; if i<0 then raise error end; 麻烦的倒是要先清注释,再清掉字符串常量[/quote] 最后再加一个判断, if i>0 then //begin太多
yyfhz 2014-06-26
  • 打赏
  • 举报
回复
引用 10 楼 xiaowei_001 的回复:
[quote=引用 9 楼 yyfhz 的回复:] [quote=引用 3 楼 wr960204 的回复:] 最基本的,一个栈,遇到Begin压栈,遇到end弹栈.
差不多吧,当栈里面没有东西还要popup就报错,更简单的可以用一个变量 i:=0; while file is not EOF do begin read next word; if next word is 'begin' then i:=i+1; if next word is 'end' then i:= i-1; if i<0 then raise error end; 麻烦的倒是要先清注释,再清掉字符串常量[/quote] 这样还是有问题吧,如 begin end end end end begin begin begin 检测不出来的,应该是楼上说的就近原则,最近的begin配最近的end,程序用什么算法好实现呢?[/quote] 它在第2个end的地方i就小于0了,然后直接raise error
xiaowei_001 2014-06-26
  • 打赏
  • 举报
回复
引用 8 楼 fang098 的回复:
[quote=引用 5 楼 xiaowei_001 的回复:] [quote=引用 3 楼 wr960204 的回复:] 最基本的,一个栈,遇到Begin压栈,遇到end弹栈.
begin,end有先后的,还有嵌套,用什么算法呢?[/quote] 最近匹配的原则啊,匹配一对就要POP出来一对,[/quote] 有什么好的算法用在这呢?
xiaowei_001 2014-06-26
  • 打赏
  • 举报
回复
引用 9 楼 yyfhz 的回复:
[quote=引用 3 楼 wr960204 的回复:] 最基本的,一个栈,遇到Begin压栈,遇到end弹栈.
差不多吧,当栈里面没有东西还要popup就报错,更简单的可以用一个变量 i:=0; while file is not EOF do begin read next word; if next word is 'begin' then i:=i+1; if next word is 'end' then i:= i-1; if i<0 then raise error end; 麻烦的倒是要先清注释,再清掉字符串常量[/quote] 这样还是有问题吧,如 begin end end end end begin begin begin 检测不出来的,应该是楼上说的就近原则,最近的begin配最近的end,程序用什么算法好实现呢?
yyfhz 2014-06-26
  • 打赏
  • 举报
回复
引用 3 楼 wr960204 的回复:
最基本的,一个栈,遇到Begin压栈,遇到end弹栈.
差不多吧,当栈里面没有东西还要popup就报错,更简单的可以用一个变量 i:=0; while file is not EOF do begin read next word; if next word is 'begin' then i:=i+1; if next word is 'end' then i:= i-1; if i<0 then raise error end; 麻烦的倒是要先清注释,再清掉字符串常量
fang 2014-06-26
  • 打赏
  • 举报
回复
引用 5 楼 xiaowei_001 的回复:
[quote=引用 3 楼 wr960204 的回复:] 最基本的,一个栈,遇到Begin压栈,遇到end弹栈.
begin,end有先后的,还有嵌套,用什么算法呢?[/quote] 最近匹配的原则啊,匹配一对就要POP出来一对,
xiaowei_001 2014-06-26
  • 打赏
  • 举报
回复
引用 6 楼 sz_haitao 的回复:
还要考虑 字符串、注释 里的begin/end
这个不用考虑的,代码是生成,不会有注释
haitao 2014-06-26
  • 打赏
  • 举报
回复
还要考虑 字符串、注释 里的begin/end
xiaowei_001 2014-06-26
  • 打赏
  • 举报
回复
引用 3 楼 wr960204 的回复:
最基本的,一个栈,遇到Begin压栈,遇到end弹栈.
begin,end有先后的,还有嵌套,用什么算法呢?
leejunokokok 2014-06-26
  • 打赏
  • 举报
回复
引用 3 楼 wr960204 的回复:
最基本的,一个栈,遇到Begin压栈,遇到end弹栈.
武稀松 2014-06-26
  • 打赏
  • 举报
回复
最基本的,一个栈,遇到Begin压栈,遇到end弹栈.
xiaowei_001 2014-06-26
  • 打赏
  • 举报
回复
引用 1 楼 fang098 的回复:
[quote=引用 楼主 xiaowei_001 的回复:] 如:begin与end需配对使用, begin begin end end begin end 如何检查出是否配对正确,错误情形很多, 1、缺少end与之配对 begin //end 2、缺少begin与之配对 //begin end 3、多end或者多begin begin begin end end end 类似这些错误,如何检查出这些错误呢
这是要写编译器的节凑啊,用delphi自带的dcc32手动编译吧 dcc32 [options] filename [options] 如果要自己做,源文件比较大要考虑用正则表达式去处理了。[/quote] 写一个类似编译检查错误的东西,配对不会很多,主要算法如何实现
fang 2014-06-26
  • 打赏
  • 举报
回复
引用 楼主 xiaowei_001 的回复:
如:begin与end需配对使用, begin begin end end begin end 如何检查出是否配对正确,错误情形很多, 1、缺少end与之配对 begin //end 2、缺少begin与之配对 //begin end 3、多end或者多begin begin begin end end end 类似这些错误,如何检查出这些错误呢
这是要写编译器的节凑啊,用delphi自带的dcc32手动编译吧 dcc32 [options] filename [options] 如果要自己做,源文件比较大要考虑用正则表达式去处理了。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧