Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(只是因为 GFW 导致 Telegram 不能用打个电话)关于某消元法的 issue #1

Open
duangsuse opened this issue Mar 17, 2019 · 2 comments

Comments

@duangsuse
Copy link
Collaborator

duangsuse commented Mar 17, 2019

某些可能和这个该死的 issue 有关的事情:

  • 为什么说是关于 (高斯-约当)消元法?

因为这次新弄的是从这篇介绍高斯-约当算法的文章上复刻下来的,方便自己下去打印了看。

  • 为什么要开这个 issue?

Telegram 之前上的 MTProto 代理,真舒服,结果最后我从网上随便找的 Proxy 现在全部爆炸了(估计是人太多挤炸了)(现在我越发展系统管理的能力就越差了,呵呵,大概是复杂的东西越找越多然后瞬间信心都没有了,因为实在是 见得多了... 🐸 ),我得继续维护我的笔记啊... 🤔 😢 So F@CK YOU fānghóng新!

  • 所以你到底要干什么?

我要给 @LEXUGE 发 comment 啊,因为我 Telegram 很难上了嘛。我 最后(指上学前) 有话要说...

lexuge:

我错了,我不该用 <code> 装这些的
本来这周有很多笔记想发在 dsuse 频道上的,可惜网络不通畅,加上我每周就周日早上到周六中午这点时间还是太少了,别说工程实践理论的笔记想讲都难讲完,当然也有我打字慢的原因。 那就只能先说一部分,然后剩下的有时间了再喽。

--

三月十七和之前这七天学了点东西,觉得可能对大佬有帮助,大佬可以收着呗:

  • ice1000 的 Haskell Monad 解析组合子套餐
    送给目前在用 subsequence 解析 String 的你

-- 后来我才知道你新写了个了 Rust 的 pest PEG 解析器...
https://github.com/XCH-CEB/xch-project/blob/master/lib_xch/src/parser/ast/treebuilder.rs#L30
之前发的是我以为没有这个新前端,要不然想来 WebAssembly 的前端也不好做到输入即时检查解析配平啊...
知道你目前应该不会主要学写编译器或者写其他更简单的基于编译原理知识的东西,所以我只想提一点可以帮助扩展 XCH_CEB 前端程序重构的基本思路

== 写程序『认』字符串表达的结构的方法论

duangsuse 目前尝试过的,一共有三种:第一种是针对 String 的子串递归解析法、第二种是针对字符(或者词元)流的递归下降解析法、第三种则是基于各种字符串模式匹配算法的(比如 LL、LR、LALR),而基于 LALR 之类的算法则可能会使用到栈和线性表等数据结构

一般来说直接字符流递归下降法会比拿一串固定长度字符串 subseq、递归下去要好看很多,信息往往可以隐式传递,直接调用 getc() 这种比 index 字符串的往往好一些(虽然基于流也会有 buffer 维护/语法歧义分支解析 lookAhead 的问题(设计不好的解析器子程序或许还要输入流支持反向 seek),但是这些问题其实在 subsequence 里也存在),而且可以用简单的 return 指令允许更灵活地控制解析流程。

基于流的处理方法其实非常 UNIX,但是即便是要处理递归文法,好像初学者都会用拆分子串法(XCH-CEB 目前使用的其实就是拆分 regex 匹配),因为递归总是难理解一些。(虽然递归写解析器很方便)

解析器也是属于编译原理/自然语言处理里面非常基础的内容了,所以它叫前端,稍微有点意思的可能就是二维文法了,反正编译原理的解析器,一般都很 trivial,没啥值得研究的。

稍微进阶一点的基础可能就是解析二元操作优先级了,加入右优先级的话,就可以处理 1^2^3 (应该被解析为 1^(2^3) 而不是 (1^2)^3)这种『右结合性』的表达式了,这又涉及到解析器进行左递归还是右递归(然后回溯出的二元语法树哪个子树离根节点远)(参见 lambda 算子 当然是从这里看到的),,,

这就有点类似于 C++ 的 std::cout << 流式操作和 Java8 的 System.out.println 对比一样,其实曾经写循环调用 println 打印数据或者 String.format,还不如直接 << 操作符写输出呢。

subsequence 解析法的例子:

基于字符流的解析器例子(也有些是 Lexer,或者说输出词条的 Parser 层面的东西)

最后推荐文章,建议去体验一下 parser combinator(parserc) 风格的解析器(如果还没有的话)

https://ice1000.org/2017/07/26/HaskellParsers/
https://ice1000.org/2017/07/26/HaskellParsers2/
https://ice1000.org/2018/11/23/MultiDimentionalSyntax/

这个 Functional DFS(Haskell Applicative 函数式思路深度优先搜索) 的也很好看
https://ice1000.org/2017/05/26/UseMonadInDfs/
这里有源代码,不过好像是改了一小部分防无脑抄的?
https://ice1000.org/gist/fp-dfs/

-- 后来我才知道你新写了个了 Rust 的 pest PEG 解析器...
https://github.com/XCH-CEB/xch-project/blob/master/lib_xch/src/parser/ast/treebuilder.rs#L30
之前发的是我以为没有这个新前端,要不然想来 WebAssembly 的前端也不好做到输入即时检查解析配平啊...

这位学长是硕士(研究生)毕业... 服
也是喜欢玩各种线性代数和其他高等数学方面的东西...

https://github.com/duangsuse/Share/blob/master/Gauss-Jordan-elimination.pdf

我抄来的文字(

他记了不少高等数学笔记,都在自己的博客上,也有 GitHub,可以膜一下。

--
虽然我不得不说,其实在中国目前的教育体制下,很多学生命中注定就得学一些入门的高等数学内容了... 当然还是入门

但这些真的是高等数学,不是现在高中数学会教的导数(原谅我目前数学还不好,所以无法举出好例子来)还有某知乎民科(搜索:哥巴赫猜想 知乎)的基本逻辑演绎证明...

@LEXUGE
Copy link

LEXUGE commented Mar 23, 2019

曾经自己写的regex不是递归下降的,现在构建的AST(如果算的话)还是递归的。
上面提到那么多,自己写过还是有点感悟的,但是并不全懂。
暑假了再重构,谢谢指点!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants