这还把一个 leftright recursive 给弄错了,是我的问题,抄了 Lua 的解决思路却没有做好逻辑上的理解工作,生搬硬套
/tmp/duangsuse.sock
#PLT #Parsing 下面我会告诉大家一些关于编写二元操作解析器的事情 calc.c++ 是我练习写 parser 的一个小程序,它的打算是成为一个二元运算计算器(也没有必要成为更多了) 二元计算是什么呢?上过小学的人知道有四则运算(加减乘除) 并且,当加法和乘法同时出现的时候先算乘法,比如 1 + 2 * 3 = 1 + (2 * 3) = 1 + 6 = 7 然后要『按顺序执行计算』(当然也有交换律(commutative law)什么的)。 3 + 2 + 1 = (3 + 2) +…
... 总而言之,理论就是这样,大家去实践吧,也没啥好讲的了...
就是字符流字符流字符流... 啊,一般都是用解析组合子好了
解析子程序的话怎么组织,一般都是传 lhs 和 lhs_precednece,当然只传 lhs 也是可以
我这个性能痴每次看到一个 char 一个 char 的处理甚至判断都想死... 感觉要慢炸了,其实那些自动生成的还应该反而慢一些呢...(何况那题解根本不可接受)
其实写代码调试的时候 大概也是可以看的出具体情况的,重要的是要写出来...
虽然可能没啥意思了... 也不是很成功
就是字符流字符流字符流... 啊,一般都是用解析组合子好了
解析子程序的话怎么组织,一般都是传 lhs 和 lhs_precednece,当然只传 lhs 也是可以
我这个性能痴每次看到一个 char 一个 char 的处理甚至判断都想死... 感觉要慢炸了,其实那些自动生成的还应该反而慢一些呢...(何况那题解根本不可接受)
其实写代码调试的时候 大概也是可以看的出具体情况的,重要的是要写出来...
虽然可能没啥意思了... 也不是很成功
关于计算表达式终止的问题,我就的确没有考虑到,也导致了这次我没有完全成功...
实际上,我不知道 infix chain 表达式应该何时终止,我以为其中也可以包含换行的,但那样就和 REPL 的『执行』键冲突了,其他语言语法上可能支持的原因是他们有对应的终结符(比如,Java 里二元表达式链肯定是在诸如函数调用参数的地方,而那些地方有对应终结符(Terminator))
然后我写的语法树推导,就没有终结符... 我开始没有考虑到这个问题,之前的 BinOps 是正确处理了冲突的(表达式只能写在一行内)
有时候单单考虑一个知识点不难,难在 all together 而且还不能错...
实际上,我不知道 infix chain 表达式应该何时终止,我以为其中也可以包含换行的,但那样就和 REPL 的『执行』键冲突了,其他语言语法上可能支持的原因是他们有对应的终结符(比如,Java 里二元表达式链肯定是在诸如函数调用参数的地方,而那些地方有对应终结符(Terminator))
然后我写的语法树推导,就没有终结符... 我开始没有考虑到这个问题,之前的 BinOps 是正确处理了冲突的(表达式只能写在一行内)
有时候单单考虑一个知识点不难,难在 all together 而且还不能错...
/tmp/duangsuse.sock
正确的优先级和 infixl/r 处理
比如:lhs / rhs
infixl + = (2-1)-1 = 1 / infixr ^ = (1-1) = 0
最终右结合
infixl - = (1-1)-1 = 0 / infixl - = (1-1) = 1
最终左结合
infixr ^ = (1-0)-1 = -1 / infixr ^ = 1-1 = -1
最终右结合
关键在对 infixr 右边赠优先级的添加上,等号右边最终比左边高一个等级(把默认的 -1 infixl 赠优先级抵消了)
然后会进到下面
infixl + = (2-1)-1 = 1 / infixr ^ = (1-1) = 0
最终右结合
infixl - = (1-1)-1 = 0 / infixl - = (1-1) = 1
最终左结合
infixr ^ = (1-0)-1 = -1 / infixr ^ = 1-1 = -1
最终右结合
关键在对 infixr 右边赠优先级的添加上,等号右边最终比左边高一个等级(把默认的 -1 infixl 赠优先级抵消了)
然后会进到下面
if (lhsprec < rhsprec) ... else 的 else branch 里#sysadmin #linux #Haskell 灵魂 Shell 迫真堆砌... 这都能编程...
虽然最终的代码根本不能看,但这居然可以编程...
虽然最终的代码根本不能看,但这居然可以编程...
for i in `ldd /bin/pandoc |grep not|awk '{print $1}'`; do name=`echo $i | awk -F- '{print $1}'`; echo -e "Mapping $i (\e[35m$name\e[0m) to \\n \\e[34m" found=`find /usr/lib64/$name*`; printf "\e[0m"; [ "$found" == "" ] || sudo ln -s $found $i; done
for i in `ldd /bin/pandoc |grep not|awk '{print $1}'`; do name=`echo $i | awk -F- '{print $1}'`; found=`find /usr/lib64/$name* | head -n1`; echo -e "Mapping $i (\e[35m$name\e[0m) to \\n \\e[34m$found\\e[0m"; [ "$found" == "" ] || echo sudo ln -s $found /usr/lib64/$i; done
目前准确度很辣鸡,在修改for i in `ldd /bin/pandoc |grep not|awk '{print $1}'`; do name=`echo $i | awk '{ gsub("-", "\n", $1); print $1 }' | grep -E '^[A-Za-z]*$' | xargs | sed 's/ /-/'`; found=`find /usr/lib64/$name* | head -n1`; echo -e "Mapping $i (\e[35m$name\e[0m) to \\n \\e[34m$found\\e[0m"; [ "$found" == "" ] || echo sudo ln -s $found /usr/lib64/$i; done
这个方法实在是太危险了...Forwarded from Deleted Account
这里修的万分淡疼、Bash、AWK、SED、Coreutils,我马上 perl 都要用上了,可是我已经花了一个小时了,干脆不要用 Pandoc 算了
Forwarded from Deleted Account
这里对打包的版本问题真的没救了,不仅 dirty 而且还很麻烦,我很久没有弄好...