重现木兰编程语言(八)块结构支持,词法规则的讲究
此刻支持的语法{ a=2 b=a*a print(a+b) }
项目地址仍在 MulanRevive/prototype。
接续上文,添加"块"结构的支持。
首先在之前所有语法规则 之后 添加了如下两条词法规则:分词器母机.add("前括号", "{r*n*") 分词器母机.add("后括号", "r*n*}")
相关语法修改如下:声明 : 表达式声明 | 赋值 | 块 块 : 前括号 声明列表 后括号
块结构的语法树转换比较有趣。
Python 的语法描述中并无block一说。
看样子就是将{print(2)}等价为了这样的 Python 代码:if True: print(2)
与下面 python 生成的语法树比对,的确如此。>>> ast.dump(ast.parse("if True: print(2)"), True, True) "Module(body=[If(test=NameConstant(value=True, lineno=1, col_offset=3), body=[Expr(value=Call(func=Name(id="print", ctx=Load(), lineno=2, col_offset=1), args=[Num(n=2, lineno=2, col_offset=7)], keywords=[], lineno=2, col_offset=1), lineno=2, col_offset=1)], orelse=[], lineno=1, col_offset=0)])"
什么是NameConstant?这里说:
True, False or None. value holds one of those constants.
看起来就是用于真/假/空三个值。Python 3.8 后就被Constant替代了。
接下来困惑于前后括号正则表达式中的r*n*部分许久。乍一看是为了支持括号前后带换行。
如果仅前括号之后有换行:{ print(3)}
词法分析结果为:Token("前括号", "{ ") Token("标识符", "print") Token("(", "(") Token("整数", "3") Token(")", ")") Token("后括号", "}")
语法分析无误,运行输出 3.
但是,如果源码的后括号之前有换行:{ print(3) }
则词法分析出了个"换行":Token("前括号", "{ ") Token("标识符", "print") Token("(", "(") Token("整数", "3") Token(")", ")") Token("换行", " ") Token("后括号", "}")
对比原始木兰的词法解析结果:Token("LBRACE", "{ ") Token("IDENTIFIER", "print") Token("(", "(") Token("INTEGER_LITERAL", "3") Token(")", ")") Token("RBRACE", " }")
为何 能被合在后括号中呢?
对照逆向工程各种尝试,最后发现是这条词法规则放置位置的问题:分词器母机.add("换行", " ")
这条规则在逆向中,置于所有 add 的规则最后,在 ignore 规则之前。同样处理之后,词法分析和运行结果即如预期。
看来,词法规则添加的先后决定了词法分析的优先级。只在所有前面的规则无法匹配时,才尝试后面的规则。
就这么点进展,可还是留下了一个隐隐的坑。在这个词法规则中:分词器母机.add("前括号", "{r*n*")
逆向中最后还有个参数flags=(re.DOTALL)
根据 rply 源码,这个参数在正则匹配时使用,但不解的是,python 文档中的re.DOTALL似乎只对正则中的.有效,而前后括号的正则描述中并无.,那么这个参数是做什么用的呢?
暂且绕过继续。
iQOOneo6和荣耀60之间,该如何选?如果让我选择,那一定是iQOONeo6!倒不是说荣耀60这手机不行,而且切入点跟我的需求点不一样,再说这电子产品大家都主张买新不买旧。荣耀70都快发布了,这时候再买荣耀60是不是显
荣耀70系列配置曝光全系京东方高频调光屏,处理器或是这三款日前,有海外爆料人员透露了荣耀70系列新机的配置规格,吸引了大批消费者关注。据悉,该系列新机也将有望在下个月正式跟大家见面,下面就一同来看看曝光的配置信息吧。据爆料,荣耀70系列此
数字藏品NFT是什么来头?MiloInu持续加大自身的圈内影响力NFT是一项大生意,到2021年将花费约250亿美元在它们上。但尽管有这么多钱在飞来飞去,但不可替代的代币尚未进入主流文化。数以千万计的人听说过NFT,但只有一小部分可以描述它们的
华为官宣华为应用市场登陆最新宝马7系华为终端云服务微博在今天下午1602官宣华为应用市场登陆全新BMW7系,用户在后排BMW悬浮式巨幕可体验影音娱乐新闻阅读儿童等多品类车载应用,享受视听娱乐亲子出行等多场景智慧出行!
世界经济论坛报告数字孪生技术有望打造更有韧性的城市中新财经4月23日电(记者彭大伟)记者23日获悉,世界经济论坛和中国信息通信研究院(信通院)联合发布的最新报告显示,数字孪生技术有望改善都市生活,打造更有韧性的城市。报告同时指出,
如何打造逼真适用的战场元宇宙这些新技术提供了现实可能近年来,随着信息网络技术的发展,各种新名词新概念新事物层出不穷。继大数据云计算物联网区块链等之后,元宇宙又为越来越多的人所关注。其实,元宇宙并非新名词。它是源于30年前的小说雪崩中
国家电网新型电力系统技术创新联盟成立国家电网消息,为了突破能源领域技术瓶颈,今天国家电网发起成立新型电力系统技术创新联盟。据介绍,联盟将引领我国能源行业全面推进八大电力科技创新示范工程,包括新能源主动支撑新型储能氢能
用好数字技术实现双碳目标作者张进财实现双碳目标,从根本上必须依靠科技创新,其中数字技术发挥着极其重要的作用。当前,新一轮科技革命和产业变革深入发展,数字技术日益融入经济社会发展各领域全过程。用好数字技术助
马斯克的航天公司难道比我们国家的航天技术还高?刚看到那个新闻特斯拉汽车老板马斯克创建的SpaceX航天公司送了4个非专业航天员身份的普通人上太空玩了3天,当然人家那4个人也是花了钱的,然后我国航天员杨利伟也说了,这方面我们国家
远景发布全球首批零碳电池鞭牛士4月23日消息,远景科技集团昨日发布2022碳中和行动报告。报告中,远景发布了全球首批零碳电池基于全生命周期方法(LCA法),对远景动力供货奔驰的EAHE2201A型号锂离子
纯电之魅长安新能源糯玉米长安新能源糯玉米开始预售啦,价格35万,共有七种外观颜色选择,三门四座,隐藏式门把手,续航155KM210KM。接送萌娃神器,购物出行帮手,在预售阶段交158享六重豪礼,预售认筹礼