纪念一次尝试写语法分析器

源码地址:
https://github.com/changchunjunhao/GrammarAnalyzer
架构搭错了:
我的架构是:
链,里面是虎视眈眈的结构生产者,生产者里面有自己的识别机
每一个单元经过的时候,都会被这些生产者所接触,
如果该单元能被生产者所接受,则里面的识别机前进一步,
如果不能被接受,则标记当前状态为不接受任何字符,直至已经有人输出作品
当一个生产者的识别机到达一定状态,确定这些读入的字符串是只有自己所能处理的字符串时,
将输出作品,同时重置所有生产者(包括其识别机),将输出的作品压入栈中。

栈,里面是输出的作品,(其中不乏是半成品,比如”public static void main(”
虽然知道他是函数,但是为了使的分析的结构清晰,将它分为 public static void main( + args + ){ + clause + }的结构)
这也是上文所造成的,因为每个生产者之间应该是互不干扰的,但是有些生产者不可能一下子就将最后结果输出,比如class语句
所以这里就引入一个半成品(到达Clause条件,比如上文的”(“),将半成品输入到栈中)
每一次输入到栈中的作品,将尝试与栈顶元素合并,如果失败则直接push到栈中,如果合并成功,将合并的产物与新栈顶尝试合并(递归)

好处:每个生产者达到互不干扰的,(除了合并步骤,但是也是通过外部传值,并没有直接干涉内部处理)
这为动态添加删除生产者 提供便利,(只需将生产者加入到链中的相应位置)
坏处:有时候输出的半成品,并不是它所希望的类型(过早输出) 比如 ArrayList,会读成ArrayList < Object(LogicalExpression)
也就是 半成品过早输出的问题(因为一旦输出,链中排在它之后的就得结束,被重置)

举例说明:
https://img-blog.csdn.net/20150505232545564

收获: 在废墟中另起炉灶
先搭设好架构(grammar.Factory grammar.struct.producer.StructProducer grammar.struct.Struct)
特别是(unit.UnitFactory unit.UnitProducer unit.Unit)
再慢慢填:如 unit.producer.*
额,如果还有什么经验得说的话,前期多抽象,少具体
抽象层里面的数据,应该由抽象层自己来管理(比如:grammar.struct.Struct中的clear() & reset())

Good Luck to you
Mr.Zheng
2015/05/05

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值