const
WEnter=;
key=;
next_line:array[..WEnter]of string=(';','begin','else','then','repeat','do','var');
key_word:array[..key]of string=('begin','end','function','procedure','var','if','else','repeat','until','while','type','const','for');//关键的语句(需要缩进的)
suojin=;
maxn=;
var
i,j,t,long:longint;
s:string;
pg,pg_key:array[..maxn]of string;
kg:array[..maxn]of longint;
full:array[..maxn]of boolean;
function noAlphabat(s:string):boolean;这个字符串不全为空格
begin
if s='' then
exit(true);
while s[]=' ' do
begin
delete(s,,);
if s='' then break;
end;
if s='' then
exit(true);
exit(false);
end;
procedure Enterat(x,y:longint);在x,y的地方按一个回车
var
i:longint;
s:string;
begin
for i:=long downto x+ do
pg[i+]:=pg[i];
pg[x+]:='';
s:=copy(pg[x],y,length(pg[x])-y+);
pg[x]:=copy(pg[x],,y-);
pg[x+]:=s;
long:=long+;
end;
function next(i:longint):longint;//找与第i行后9含)第一个begin对应的end
var
t,j:longint;
begin
t:=;
for j:=i to long do
begin
if pg_key[j]='begin' then
t:=t+;
if pg_key[j]='end' then
t:=t-;
if t= then
exit(j);
end;
writeln('Pairing error with begin-end!');
//close(output);
halt;
end;
function next2(i:longint):longint;//找与第i行后(含)的第一个repeat配对的until
var
t,j:longint;
begin
t:=;
for j:=i to long do
begin
if pg_key[j]='repeat' then
t:=t+;
if pg_key[j]='until' then
t:=t-;
if t= then
exit(j);
end;
writeln('Pairing error with repeat-until!');
//close(output);
halt;
end;
procedure dfs(l,r,t:longint);//第l到r区间里的代码格式化(初始值t个空格)
var
i,k:longint;
alldo,had_done:boolean;
begin
if l>r then
exit;
for i:=l to r do
kg[i]:=t;
alldo:=true;
for i:=l to r do
if pg_key[i]<>'do' then
alldo:=false;
if alldo then//全部不需缩进则跳出
exit;
i:=l;
while i<=r do
begin
had_done:=false;
if pg_key[i]='begin' then//begin处理
begin
dfs(i+,next(i)-,t+);
i:=next(i)+;
had_done:=true;
end;
if pg_key[i]='repeat' then//repeat处理
begin
had_done:=true;
dfs(i+,next2(i)-,t+);
i:=next2(i)+;
end;
if (pg_key[i]='if')or(pg_key[i]='while')or(pg_key[i]='for') then//if、while、for处理(共同点是后面可以加begin-end、也可以加do)
begin
had_done:=true;
if pg_key[i+]='do' then
begin
dfs(i+,i+,t+);
if pg_key[i+]='else' then //else后相同处理
begin
if pg_key[i+]='do' then
begin
dfs(i+,i+,t+);
i:=i+;
end;
if pg_key[i+]='begin' then
begin
dfs(i+,next(i+),t+);
i:=next(i+)+;
end;
if pg_key[i+]='repeat' then
begin
dfs(i+,next2(i+),t+);
i:=next2(i+)+;
end;
end
else
i:=i+;
end;
if pg_key[i+]='begin' then
begin
dfs(i+,next(i+),t+);
if pg_key[next(i+)+]='else' then
begin
if pg_key[next(i+)+]='do' then
begin
dfs(next(i+)+,next(i+)+,t+);
i:=next(i+);
end;
if pg_key[next(i+)+]='begin' then
begin
dfs(next(i+)+,next(next(i+)+),t+);
i:=next(next(i)+)+;
end;
if pg_key[next(i+)+]='repeat' then
begin
dfs(next(i+)+,next2(next(i+)+),t+);
i:=next2(next(i+)+)+;
end;
end
else
i:=next(i+)+;
end;
if pg_key[i+]='repeat' then
begin
dfs(i+,next2(i+),t+);
if pg_key[next2(i+)+]='else' then
begin
if pg_key[next2(i+)+]='do' then
begin
dfs(next2(i+)+,next2(i+)+,t+);
i:=next2(i+);
end;
if pg_key[next2(i+)+]='begin' then
begin
dfs(next2(i+)+,next(next2(i+)+),t+);
i:=next(next2(i)+)+;
end;
if pg_key[next2(i+)+]='repeat' then
begin
dfs(next(i+)+,next2(next2(i+)+),t+);
i:=next2(next2(i+)+)+;
end;
end
else
i:=next2(i+)+;
end;
end;
if (pg_key[i]='procedure')or(pg_key[i]='function') then
begin
had_done:=true;
dfs(i+,next(i+),t);
i:=next(i+)+;
end;
if (pg_key[i]='var')or(pg_key[i]='type')or(pg_key[i]='const')then
begin
had_done:=true;
k:=i;
while pg_key[k+]='do' do
k:=k+;
dfs(i+,k,t+);
i:=k+;
end;
if not had_done then
i:=i+;
end;
end;
begin
long:=;
while not eof do
begin
long:=long+;
readln(pg[long]);
end;
for i:= to long do
begin
t:=;
while (pg[i]<>'')and(pg[i][]=#) do
begin
t:=t+;
delete(pg[i],,);
end;
for j:= to t* do
pg[i]:=' '+pg[i];
end;
i:=;
while i<=long do//黏在一起的语句拆开
begin
for j:= to WEnter do
if pos(next_line[j],pg[i])<> then
if not(noAlphabat(copy(pg[i],pos(next_line[j],pg[i])+length(next_line[j]),length(pg[i])-pos(next_line[j],pg[i])-length(next_line[j])+))) then
begin
t:=pos(next_line[j],pg[i])+length(next_line[j]);
Enterat(i,t);
end;
i:=i+;
end;
for i:= to long do
while pg[i,]=' ' do
delete(pg[i],,);
fillchar(full,sizeof(full),true);
for i:= to long do
if pg[i]='' then
full[i]:=false;
t:=;
for i:= to long do
if full[i] then
begin
t:=t+;
pg[t]:=pg[i];
end;
for i:=t+ to long do
pg[i]:='';
long:=t;
for i:= to long do
begin
for j:= to key do
if pos(key_word[j],pg[i])<> then
begin
pg_key[i]:=key_word[j];
break;
end;
if pg_key[i]='' then
pg_key[i]:='do';
end;
dfs(,long,);
for i:= to long do
kg[i]:=kg[i]*suojin;
for i:= to long do
writeln('':kg[i],pg[i]);
end.

比较坑爹的就是for循环嵌套无法处理,求大神帮修改

Pascal代码自动格式化的更多相关文章

  1. 关于eclispe保存代码自动格式化的设置

    最近在项目开发,上级要求所有开发人员,代码必须格式和(Ctrl+Shift+F),但是还是会偶尔忘记格式化,今天看了有一种保存之后eclipse可以自动格式代码的设置 1.请大家在eclipse设置下 ...

  2. visual studio粘贴html代码.会自行添加一些未知代码(自动格式化)

    比如我们要粘贴这样一段代码到VS这里 <option {if empty($param.is_active)}selected=selected{/if}>请选择</option&g ...

  3. Eclipse中对Python代码自动格式化!

    在Eclipse中使用PyDev发现无法进行代码格式化,使用通常的"Ctrl+Shift+F"快捷键,没有任何变化,难道不能对python代码格式化了吗? 通过下面设置,就可以每次 ...

  4. vue eslint 代码自动格式化

    vue-cli 代码风格为 JavaScript Standard Style 代码检查规范严格,一不小心就无法运行,使用eslint的autoFixOnSave可以在保存代码的时候自动格式化代码 V ...

  5. Myeclipse 自定义代码自动格式化(ctrl+alt+F)

    打开如图界面:preference->java->code style->formatter下的edit... 如设设置java代码多长换行:

  6. vim中代码自动格式化

    参考资料: https://blog.csdn.net/qachenzude/article/details/25511875 1,gg 跳转到第一行 2,shift+v 转到可视模式 3,shift ...

  7. spotless-maven-plugin java代码自动格式化mvn spotless:apply -fn

    <plugin> <groupId>com.diffplug.spotless</groupId> <artifactId>spotless-maven ...

  8. VS Code中python代码自动格式化 代码自动检查

    VS Code菜单栏中依次打开 File—Preferences—Settings,搜索框中搜索“python.formatting.provider”, 然后在下拉菜单中选择autopep8,yap ...

  9. 解决vscode按下ctrl+S的时候自动格式化

    按下ctrl+S的时候自动格式化 为什么需要这种操作? 优点: 保存的时候格式化,让我们的代码自动格式化,减少人工调整. 缺点: 有一些打好包的JS有时候修改一下,但不需要格式化,因为打好包就是要压缩 ...

随机推荐

  1. 2019年12月12日英语学习-Will I Or Won't I ?

    这节英语课上的内容没记住多少东西,觉得这个主题太枯燥了,不过整堂课和外教沟通交流还是不错的,因为这节课就我一个学生.给我了充分的机会去张嘴交流互动. 也没记住什么东西,不知道写什么.只记住将要决定做某 ...

  2. NX二次开发-UFUN获取当前所在的模块UF_ask_application_module

    NX9+VS2012 #include <uf.h> #include <NXOpen/UI.hxx> #include <NXOpen/MenuBar_MenuBarM ...

  3. 求树的最大独立集,最小点覆盖,最小支配集 贪心and树形dp

    目录 求树的最大独立集,最小点覆盖,最小支配集 三个定义 贪心解法 树形DP解法 (有任何问题欢迎留言或私聊&&欢迎交流讨论哦 求树的最大独立集,最小点覆盖,最小支配集 三个定义 最大 ...

  4. Greenplum(PostgreSql)函数实现批量删除表

    项目做库迁移,前期需要经常调整表结构语句,涉及多次的批量drop,本着偷懒精神写了这个函数.鉴于本函数在生产环境有巨大风险,建议测试完毕后立即删除. 主要步骤很简单:1)从pg_tables查询得到相 ...

  5. Python3 From Zero——{最初的意识:002~字符串和文本}

    一.使用多个界定符分割字符串 字符串.split(',')形式只适用于单一分割符的情况:多分割符同时应用的时候,可使用re.split() >>> line = 'asdf fjdk ...

  6. 打包的@font-face包

    在网页中使用 @font-face 规则嵌入字体,前提是可以从你的网站或第三方 Web 服务器下载到相应的字体.以这种方式提供的字体,会在使用该字体的页面第一次加载时被浏览器下载并缓存起来,以后就不用 ...

  7. Python3实战spark大数据分析及调度✍✍✍

    Python3实战spark大数据分析及调度  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...

  8. python 15 文件操作(一)

    转自 http://www.cnblogs.com/BeginMan/p/3166644.html 一.文件对象 我理解的文件对象就是一个接口,通过这个接口对文件进行相关操作. <Python ...

  9. LA 3263 /// 欧拉定理 oj21860

    题目大意: n个端点的一笔画 第n个和第1个重合 即一笔画必定是闭合曲线 输出平面被分成的区域数 欧拉定理 V+F-E=2 即 点数+面数-边数=2 (这里的面数包括了外部) #include < ...

  10. linux格式化磁盘

    linux格式化磁盘 查看系统磁盘情况 [root@db02 ~]# fdisk -l #查看当前系统上所有存储设备(包括挂在和没挂载的)  注:如果没有管理员权限是看不见磁盘的,因为fdisk默认读 ...