duangsuse::Echo
待会继续说『绝句』的,我一定要先实现这个玩意... (虽然可能不如 parser 们更优雅,因为虽然它是完整的模板语言,也有被当成 CPP 这种『逐行处理』的风险... 汗) 先一言不合就念诗: int main() { ~绝句~ [唐] 杜甫 『两』个『黄鹂』;鸣『翠柳』 『一』行『白鹭』... 上『青天』 『窗』含『西岭;『千』秋『雪』』 『门』泊『东吴』。『万』里『船』 } 说这玩意是代码你们相信么? 如果这执行玩意可以打印出下面这种东西,你们相信么? 🌴🦜🦜🎵 🐦🐦🐦🐦👆🌥 🏠👅西岭📆*1000years:❄️…
和 PerlYuYan 略有不同,因为绝句是自带 scannerless 解析器的模板系统,而且不支持自然语言分词(我觉得这有益于可读性)
和 itorr 大佬的 e 网页、templetJS 也有不同,但有相似
绝句也是模板语言,可是它的功能比普通的模板语言要多,而且支持 2D 文法,所以 templet 的这种语法:
@:: lang=HTML
当 b 成立,输出 b,否则 e 当成立,输出 d,否则什么都不输出
当 a 成立,输出 c
templet.js 支持的
变量、子属性、变量判断、运算判断、数组循环、对象循环、管道
在绝句里都是语言支持,绝句还支持函数柯里化和函数作为值,函数即是所谓的宏
变量
@:: a -> 1
@:: a += 1
@write "a = $a"
子属性是 JavaScript 里的,绝句不面向对象,不支持
则就可以支持引用对象属性
变量判断说了,运算判断比较复杂,templet 是直接执行 JavaScript Function 的,因为绝句是单独解释的编程语言...
数组循环、对象循环,绝句因为是 Java 编写所以支持反射对象访问,不过对绝句来说 Object 会被映射为 Map...
函数管道,绝句支持函数式编程,可以这样定义一个函数:
#Android #GUI https://github.com/ayaseruri/TagsView
是时候好好学学前端了...
和 itorr 大佬的 e 网页、templetJS 也有不同,但有相似
绝句也是模板语言,可是它的功能比普通的模板语言要多,而且支持 2D 文法,所以 templet 的这种语法:
<p> {{$1==1}}
<code>一等一</code> 是正确的,所以我显示出来啦 {{/1==1}}
</p>
<p> {{$变量一==变量二}}
<code>变量一==变量二</code> 是不是正确的呢 {{/变量一==变量二}}
</p>
可以理解为 JavaScript 代码if (1==1) { writesM("<code>一等一</code> 是正确的,所以我显示出来啦"); }
if (变量一==变量二) { writesM("<code>变量一==变量二</code> 是不是正确的呢 {{/变量一==变量二}}"); }
而换到绝句,就是这样@:: lang=HTML
@// 语言分词支持是可以自己定义的,可以用 Java 定义也可以用绝句定义分词规则,定义『标记、字符串、注释、标识符』这几种词条(绝句提供了更好的方法,对 Heredoc、String interpolation 和多重 string 这三种模式都有支持)@? 1 = 1
<code>一等一</code> 是正确的,所以我显示出来啦@? 变量一 = 变量二
<code>变量一==变量二</code> 是不是正确的呢至于 if 的嵌套问题,二维文法可以解决
@?a当 a 成立,输出 a
a
@ ?b
b
@ ,? e
d
@ ,
c
当 b 成立,输出 b,否则 e 当成立,输出 d,否则什么都不输出
当 a 成立,输出 c
templet.js 支持的
变量、子属性、变量判断、运算判断、数组循环、对象循环、管道
在绝句里都是语言支持,绝句还支持函数柯里化和函数作为值,函数即是所谓的宏
变量
@:: a -> 1
@:: a += 1
@write "a = $a"
子属性是 JavaScript 里的,绝句不面向对象,不支持
<dl>这就是说如果要遍历一个对象(如果是数组,则使用
{{#hash}}
<dt>{{键}} <dd>{{值}}
{{/hash}}
</dl>
{{.}} 来引用当前项)则就可以支持引用对象属性
{键:1, 值:2}
templet 的实现是『对每个循环属性名使用索引前缀』... 我不知道为啥这么做,好像是因为模板处理器没有递归所以害怕冲突?(可是都用 var 好像不会冲突...)变量判断说了,运算判断比较复杂,templet 是直接执行 JavaScript Function 的,因为绝句是单独解释的编程语言...
数组循环、对象循环,绝句因为是 Java 编写所以支持反射对象访问,不过对绝句来说 Object 会被映射为 Map...
函数管道,绝句支持函数式编程,可以这样定义一个函数:
@无聊的操作(数字):从『将『数字』转为『字符串』』解析数字绝句的参数列表自然是要求比较高的... 目前想到了一个指定 index 的方法
@无聊的操作二(数字):
let 函数:(将...转为『字符串』++ 从...解析『数字』),
in 函数『数字』
@『a,2』操作『b,1』。 允许绝句代码这样使用 @操作(b,a)。 (或者 @操作(b)(a).)#Android #GUI https://github.com/ayaseruri/TagsView
是时候好好学学前端了...
GitHub
GitHub - audreyt/lingua-sinica-perlyuyan: Perl in Classical Chinese in Perl
Perl in Classical Chinese in Perl. Contribute to audreyt/lingua-sinica-perlyuyan development by creating an account on GitHub.
duangsuse::Echo
和 PerlYuYan 略有不同,因为绝句是自带 scannerless 解析器的模板系统,而且不支持自然语言分词(我觉得这有益于可读性) 和 itorr 大佬的 e 网页、templetJS 也有不同,但有相似 绝句也是模板语言,可是它的功能比普通的模板语言要多,而且支持 2D 文法,所以 templet 的这种语法: <p> {{$1==1}} <code>一等一</code> 是正确的,所以我显示出来啦 {{/1==1}} </p> <p> {{$变量一==变量二}} <code>变量一==变量二</code>…
This media is not supported in your browser
VIEW IN TELEGRAM
看到前端们的 HTML, CSS, JS, CSS 动画,又被自己菜自闭了。
勉强仗着自己还会点 HTML、SGML,会使用 DOM 以及能够抽象/符号化/结构化分析问题以及比别人快点,往往能和作者共意稍微有点好转的倾向...
duangsuse 在抽象分析的时候稍微看得清那些眼花缭乱的 API 使用、存储和算法结构一些
啥时候我要去写点前端。
勉强仗着自己还会点 HTML、SGML,会使用 DOM 以及能够抽象/符号化/结构化分析问题以及比别人快点,往往能和作者共意稍微有点好转的倾向...
duangsuse 在抽象分析的时候稍微看得清那些眼花缭乱的 API 使用、存储和算法结构一些
啥时候我要去写点前端。
#dev #pl #cs #story https://github.com/audreyt/lingua-sinica-perlyuyan/blob/master/Changes
https://github.com/ybay/yZhPy/blob/master/plugcn.py
https://github.com/ybay/yZhPy/blob/master/plugcn.py
GitHub
audreyt/lingua-sinica-perlyuyan
Perl in Classical Chinese in Perl. Contribute to audreyt/lingua-sinica-perlyuyan development by creating an account on GitHub.
duangsuse::Echo
写的太多不知从何说起... 时间还是不够啊 我不是把时间给虵(shé 🐸)了... QAQ 就先说绝句、二进制和字符流 Parser 框架 这些最令人 excited 的玩意 Parser 框架我还打算自己手写这些算法: TrieTree (只需要 Trie,因为只是字符流嘛,Radix 树还不如自己手动 maybe 匹配解析... 虽然那样好像没有优化了) RangeMap (到学校里想了会,发现还真不是那么简单的,滚动歌词什么的还真是可以简单点,但是 RangeMap 可以启用二分查找技术和区间碰撞检测,进而可以实现…
所以说,我觉得要完成这些类,才能做一个比较好的解析器框架:
== 数据结构和算法部分
TrieTree
CharTrieTree
RangeMap
LinearRangeMap
HashRangeMap
BsearchRangeMap
FuzzyCollisionRangeMap
CollisionRangeMap
NestedRangeMap
VersionizedMap
CollisionVersionizedMap
MultiMap
ReverseIndexedMultiMap
NaiveMap (就是简化掉一些非关键方法的 java.util.Map 外加一些静态辅助函数)
ArrayMap
== 辅助类部分
Pair
Range
MixedArrayLinkList
MixedArrayHashMap
RandomReadStream
StringView
MRL (Media Resource Locator)
== 框架部分
Identifible
SourceManager
SourceLocation
BinaryLocation
OffsetRange
InlineDoc
Comment
Spaces
PositionMarker
— exception
ReadError
OpenError
DecodeError
ParseError
WriteError
AllocationError
— matcher
Parser
Matcher
RepeatResult
SequenceResult
BranchResult
— text
TextInputStream
TextOutputStream
CharsetInputReader
TextInputOperator
TextCombinator
— binary
ByteOrdDataInput
OrderedDataInput
ByteOrdDataOutput
OrderedDataOutput
BinaryProcessor
StructReader
StructWriter
— annotation
BinaryStruct
Aligned ByteOrder Encoding
Let Repeats Skip Size
— unsigned
ubyte ushort uint ulong
== 数据结构和算法部分
TrieTree
CharTrieTree
RangeMap
LinearRangeMap
HashRangeMap
BsearchRangeMap
FuzzyCollisionRangeMap
CollisionRangeMap
NestedRangeMap
VersionizedMap
CollisionVersionizedMap
MultiMap
ReverseIndexedMultiMap
NaiveMap (就是简化掉一些非关键方法的 java.util.Map 外加一些静态辅助函数)
ArrayMap
== 辅助类部分
Pair
Range
MixedArrayLinkList
MixedArrayHashMap
RandomReadStream
StringView
MRL (Media Resource Locator)
== 框架部分
Identifible
SourceManager
SourceLocation
BinaryLocation
OffsetRange
InlineDoc
Comment
Spaces
PositionMarker
— exception
ReadError
OpenError
DecodeError
ParseError
WriteError
AllocationError
— matcher
Parser
Matcher
RepeatResult
SequenceResult
BranchResult
— text
TextInputStream
TextOutputStream
CharsetInputReader
TextInputOperator
TextCombinator
— binary
ByteOrdDataInput
OrderedDataInput
ByteOrdDataOutput
OrderedDataOutput
BinaryProcessor
StructReader
StructWriter
— annotation
BinaryStruct
Aligned ByteOrder Encoding
Let Repeats Skip Size
— unsigned
ubyte ushort uint ulong
#code #Java #Android 学到了 Androidx 的四个辅助 annotation
@NonNull @Nullable
@RestrictTo(RestrictTo.Scope)
@RequireApi(android.os.Build.VERSION_CODES)
@NonNull @Nullable
@RestrictTo(RestrictTo.Scope)
@RequireApi(android.os.Build.VERSION_CODES)
duangsuse::Echo
所以说,我觉得要完成这些类,才能做一个比较好的解析器框架: == 数据结构和算法部分 TrieTree CharTrieTree RangeMap LinearRangeMap HashRangeMap BsearchRangeMap FuzzyCollisionRangeMap CollisionRangeMap NestedRangeMap VersionizedMap CollisionVersionizedMap MultiMap Rev…
由于时间不够(6 点左右要走的,和虵 🐸 的时间不够是不一样的,我还有很多自己的时间)
只能写一些关于 Binary Stream Processing 的类了,此外我还会顺手练习一下 #Haskell 的 parser combinators (写个 JSON 解析器?)
这样一部分包括
Range
MultiMap
ReverseIndexedMultiMap
RandomReadStream
RandomReadStream.BinaryView
MRL
Identifible
SourceManager
BinaryLocation
OffsetRange
PositionMarker
ReadError
OpenError
DecodeError
ParseError
WriteError
AllocationError
ByteOrdDataInput
OrderedDataInput
ByteOrdDataOutput
OrderedDataOutput
BinaryProcessor
StructReader
StructWriter
BinaryStruct
Aligned ByteOrder Encoding
Let Repeats Skip Size
ubyte ushort uint ulong
只能写一些关于 Binary Stream Processing 的类了,此外我还会顺手练习一下 #Haskell 的 parser combinators (写个 JSON 解析器?)
这样一部分包括
Range
MultiMap
ReverseIndexedMultiMap
RandomReadStream
RandomReadStream.BinaryView
MRL
Identifible
SourceManager
BinaryLocation
OffsetRange
PositionMarker
ReadError
OpenError
DecodeError
ParseError
WriteError
AllocationError
ByteOrdDataInput
OrderedDataInput
ByteOrdDataOutput
OrderedDataOutput
BinaryProcessor
StructReader
StructWriter
BinaryStruct
Aligned ByteOrder Encoding
Let Repeats Skip Size
ubyte ushort uint ulong
#Haskell... Haskell 的 Text.ParserCombinators.ReadP 的 operator 还真多... 我的根本比不上... 弄了半天我连怎么解析二元运算符都忘了,唉,当入门吧...
duangsuse::Echo
虽然求值算法是递归的,但是解析的... 我暂时写不好 ReadP 解析嵌套二元运算... 所以先放着吧...
[DuangSUSE@duangsuse]~/Projects% ./Calculator
1+1
(1 + 1) = 2
2+2
(2 + 2) = 4
4/2
(4 / 2) = 2
400*100
(400 * 100) = 40000
0-1
(0 - 1) = -1
目前只能这么玩。。。。
duangsuse::Echo
#Hardware https://github.com/itsFrank/MinecraftHDL Verilog for MCHDL redstone 🙊 Wow...
原来 verilog 是这样的!
module bit2adder (
input x0, y0, x1, y1,
output o2, o0, o1
);
assign {o2, o0, o1} = {x0, y0} + {x1, y1}
endmodule
🤔 比 perl 简单一些?可是既然要给电路编程,就要写很多吧...Firtzing 也不会,勉强学了下布线,不过没有模拟功能... 差评
duangsuse::Echo
由于时间不够(6 点左右要走的,和虵 🐸 的时间不够是不一样的,我还有很多自己的时间) 只能写一些关于 Binary Stream Processing 的类了,此外我还会顺手练习一下 #Haskell 的 parser combinators (写个 JSON 解析器?) 这样一部分包括 Range MultiMap ReverseIndexedMultiMap RandomReadStream RandomReadStream.BinaryView MRL Identifible SourceManager…
绝望,看来写不了了,就学点 Haskell 吧。
选择一下
写个 JSON Parser,不过必须得把某 Monad 组合子 Parserc 框架抄写下来,这个是没有技术难度的...
扩展这个计算器,支持 ** 和 mod 运算,支持十六进制和运算符结合算了... 🙈
选择一下
写个 JSON Parser,不过必须得把某 Monad 组合子 Parserc 框架抄写下来,这个是没有技术难度的...
扩展这个计算器,支持 ** 和 mod 运算,支持十六进制和运算符结合算了... 🙈
https://ice1000.org/2017/07/27/HaskellParsers2/
要是我就选择第二种。我才不去做没有提升空间的事情...
我们先左递归描述一下我们要解析的语法
要是我就选择第二种。我才不去做没有提升空间的事情...
我们先左递归描述一下我们要解析的语法
input = binOp
binOp = addOp
opP x = do
ws charP(x) ws
addOp = numP opP('+') numP | numP opP('-') numP | mulOp
ws = whiteSpace
numP
= "0x" hexDigit
| digit+
hexDigit = satisfy (`elem` "0123456789abcdefABCDEF_")
digit = satisfy (`elem` "0123456789_")
... 好难看算了