8个稳定版本
1.1.5 | 2020年12月21日 |
---|---|
1.1.4 | 2020年12月20日 |
1.0.1 | 2020年11月26日 |
#1902 in 解析器实现
370KB
743 行
PseudoTex
PseudoTex是一个编译器,可以将伪代码转换为它的LaTeX表示形式
在大学时,我不得不写一些LaTeX报告,其中包含伪代码。将简单的伪代码转换为LaTeX命令是一个非常痛苦的过程,所以我决定制作这个工具,将简单的伪代码语言转换为LaTeX等效命令。希望它能让你更容易 😁。
PseudoTex遵循的伪代码在这个由João Leitão撰写的论文中有所规范化(查看注意事项)。
安装
目前有两种安装PseudoTex的方法,要么使用cargo
,要么下载最新的二进制版本。
使用cargo
λ ~/ $ cargo install pseudotex
使用最新版本
转到仓库的发布页面,下载二进制文件(Linux或macOS)。
运行
λ ~/ $ pseudotex --help
PseudoTex 1.0
Bruno Anjos <[email protected]>
pseudocode transpiler to latex representation
USAGE:
pseudotex [OPTIONS]
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
-i, --input <input> file name to read content from
-o, --output <output> file name to write content to
注意事项
分号
与论文中描述的语言相比,有一个主要区别,即每个语句都必须后跟一个分号。我相信这在未来可以改变,但由于这使解析器更容易构建,我决定采取这种方法。
待办事项
- 添加更多符号
- 添加测试
- 为每次提交添加测试自动化
- 添加下标
贡献
如果你想要贡献,请Fork仓库并使用功能分支。拉取请求非常受欢迎。
链接
项目依赖
示例
以下是一个小示例(查看example_protocol.pseudo)
state:
parents // these are parents ;
services;
myId;
fallback;
upon init do:
fallback = getFallback();
myId = randomString();
upon event Receive(QUALITY_NOT_ASSURED, service, location) do:
newChild = getNodeClosestTo(location);
trigger Send(DEPLOY_SERVICE, newChild, service, myself);
call addChild(service, newChild);
upon event Receive(DEPLOY_SERVICE, service, sender) do:
if service !in services:
services = services unite {service};
end
call updateParent(service, sender);
procedure updateParent(service, parent):
if service.Parent == parent:
return;
end
parents = parents unite {parent};
service.parent = parent;
foreach child in service.children:
trigger Send(GRANDPARENT, child, service, parent, myself);
end
upon event Receive(GRANDPARENT, service, grandparent, sender) do:
service.grandparent = grandparent;
procedure updateChildren(service):
orderedChild = order(service.children);
foreach child in service.children:
trigger Send(SIBLINGS, child, service, orderedChild);
end
procedure addChild(service, child):
if child !in children:
children = children unite {child};
end
if child !in service.children:
service.children = service.children unite {child};
servicesByChild[child] = servicesByChild[child] unite {service};
call updateChildren(service);
end
这段伪代码生成以下LaTeX
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[ruled,vlined,linesnumbered]{algorithm2e}
\usepackage{amssymb}
\begin{document}
{{\DontPrintSemicolon
\SetAlgoNoLine
\LinesNumberedHidden
\SetFuncSty{textbf}
\begin{algorithm}[ht]
\BlankLine
\BlankLine
\BlankLine
\SetKwFunction{FunctionID}{State}
\SetKwProg{Fn}{}{:}{}
\Fn{\FunctionID}{
parents
// these are parents
\;services
\;myId
\;fallback
}
\;\SetKwFunction{FunctionID}{Init}
\SetKwProg{Fn}{Upon }{ do:}{}
\Fn{\FunctionID}{
fallback $\longleftarrow$ \FuncSty{getFallback(}\ArgSty{}\FuncSty{)}
\;myId $\longleftarrow$ \FuncSty{randomString(}\ArgSty{}\FuncSty{)}
}
\;\SetKwFunction{FunctionID}{Receive}
\SetKwProg{Fn}{Upon event }{ do:}{}
\Fn{\FunctionID{QUALITY\_NOT\_ASSURED, service, location}}{
newChild $\longleftarrow$ \FuncSty{getNodeClosestTo(}\ArgSty{location}\FuncSty{)}
\;\FuncSty{Trigger} \FuncSty{Send(}\ArgSty{DEPLOY\_SERVICE, newChild, service, myself}\FuncSty{)}
\;\FuncSty{Call addChild(}\ArgSty{service, newChild}\FuncSty{)}
}
\;\SetKwFunction{FunctionID}{Receive}
\SetKwProg{Fn}{Upon event }{ do:}{}
\Fn{\FunctionID{DEPLOY\_SERVICE, service, sender}}{
\If{service $\notin$ services}{services $\longleftarrow$ services $\cup$ \{service\}}
\;\FuncSty{Call updateParent(}\ArgSty{service, sender}\FuncSty{)}
}
\;\SetKwFunction{FunctionID}{updateParent}
\SetKwProg{Fn}{Procedure }{:}{}
\Fn{\FunctionID{service, parent}}{
\If{service.Parent == parent}{return}
\;parents $\longleftarrow$ parents $\cup$ \{parent\}
\;service.parent $\longleftarrow$ parent
\;\ForEach{child $\in$ service.children}{\FuncSty{Trigger} \FuncSty{Send(}\ArgSty{GRANDPARENT, child, service, parent, myself}\FuncSty{)}}
}
\;\SetKwFunction{FunctionID}{Receive}
\SetKwProg{Fn}{Upon event }{ do:}{}
\Fn{\FunctionID{GRANDPARENT, service, grandparent, sender}}{
service.grandparent $\longleftarrow$ grandparent
}
\;\SetKwFunction{FunctionID}{updateChildren}
\SetKwProg{Fn}{Procedure }{:}{}
\Fn{\FunctionID{service}}{
orderedChild $\longleftarrow$ \FuncSty{order(}\ArgSty{service.children}\FuncSty{)}
\;\ForEach{child $\in$ service.children}{\FuncSty{Trigger} \FuncSty{Send(}\ArgSty{SIBLINGS, child, service, orderedChild}\FuncSty{)}}
}
\;\SetKwFunction{FunctionID}{addChild}
\SetKwProg{Fn}{Procedure }{:}{}
\Fn{\FunctionID{service, child}}{
\If{child $\notin$ children}{children $\longleftarrow$ children $\cup$ \{child\}}
\;\If{child $\notin$ service.children}{service.children $\longleftarrow$ service.children $\cup$ \{child\}
\;servicesByChild[child] $\longleftarrow$ servicesByChild[child] $\cup$ \{service\}
\;\FuncSty{Call updateChildren(}\ArgSty{service}\FuncSty{)}}
}
\BlankLine
\BlankLine
\BlankLine
\end{algorithm}
\end{document}
这将最终生成以下PDF
许可
本项目中的代码根据GPL-3.0许可。
依赖
~4–5.5MB
~100K SLoC