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. NX二次开发-创建直线UF_CURVE_create_line与NXOpen->CreateLine

    NX11+VS2013 #include <uf.h> #include <uf_curve.h> #include <NXOpen/CurveCollection.hx ...

  2. 6. 第一个jmeter脚本开发-测试百度首页

    需求:可以承受5个用户同时访问百度解题思路:我们可以从这短短的一句话中提取3个点:同时.5个并发.百度服务器解题方法:方法一:录制请求录制方法会在下一篇进行讲解,本篇不做过多介绍. 方法二:自定义添加 ...

  3. 华东交通大学2018年ACM“双基”程序设计竞赛 C. 公式题 (2) (矩阵快速幂)

    题目链接:公式题 (2) 比赛链接:华东交通大学2018年ACM"双基"程序设计竞赛 题目描述 令f(n)=2f(n-1)+3f(n-2)+n,f(1)=1,f(2)=2 令g(n ...

  4. 《DSP using MATLAB》Problem 8.46

    下雨了,大风降温,一地树叶,终于进入冬季了 代码: %% ----------------------------------------------------------------------- ...

  5. CSS3新属性之---flex box布局实例

    flex box布局实例 flex的强大之处在于不管什么布局,几行命令即可实现 /*本节模板div元素(代表骰子的一个面)是Flex容器,span元素(代表一个点)是Flex项目.如果有多个项目,就要 ...

  6. jwt、oauth2和oidc等认证授权技术的理解

    前言 jwt.oauth2.oidc等,都是和认证授权相关的规范或者解决方案,因此要理解他们,就需要从业务场景的适用性一步步的分析和认识. 一.认证授权业务场景理解 就个人目前的理解来看,一个好的软件 ...

  7. [AH2017/HNOI2017]单旋

    题目 \(\rm splay\)水平太差,于是得手玩一下才能发现规律 首先插入一个数,其肯定会成为其前驱的右儿子或者是后继的左儿子,进一步手玩发现前驱的右儿子或者是后继的左儿子一定只有一个是空的,我们 ...

  8. docker集群管理之swarm

    一.简介 docker集群管理工具有swarm.k8s.mesos等,我所用到的是swarm和k8s,这篇文章主要介绍swarm:swarm是docker集成的原生 管理工具,只要你安装上docker ...

  9. spring MVC 全局的异常处理

    1.使用SimpleMappingExceptionResolver实现异常处理 在Spring的配置文件applicationContext.xml中增加以下内容: <bean class=& ...

  10. 常用指令linux总结

    linux的基础操作命令: 常见命令: man 查看帮助文档 用法:man + 命令 help 查看指定命令的用法 用法: 命令 --help(有空格) tab linux下命令与文件名补全 用法:在 ...