我正在Rust的reStructuredText编译器中工作,并且需要一些有关如何在具有递归结构的语言中构建词汇的建议。例如,列表中的列表可以在rST中使用:
* This is a list item
* This is a sub list item
* And here we are at the preceding indentation level again.
默认docutils.parsers.rst
采用了一次扫描输入一行的方法:
reStructuredText解析器作为状态机实现,检查其状态 一次输入一行。
docutils.parsers.rst
基本上在一组形式为state machine的状态下运行。它尝试根据当前状态将当前行与(regex, match_method, next_state)
匹配,如果匹配成功,则在转换为regex
时运行match_method
,直到行用完要扫描为止。
然后我的问题是,这是扫描rST等语言的最佳方法吗?到目前为止,我的方法是创建源的next_state
迭代器,并在尝试与当前Unicode标量下的结构进行匹配时吃掉源。当我正在做的是扫描内联内容时,这种方法在某种程度上是可行的,但是我现在已经意识到,处理诸如嵌套列表之类的递归主体级结构将是一件麻烦事。感觉就像我需要一堆带有重复正则表达式的状态,以及许多状态中的相关方法,以便在换行之前匹配缩进。
最好简单地对源代码行进行迭代并对其进行迭代,并在每行的基础上进行匹配,如果这样的话,例如>
Chars
在
Chars
中遇到,只是简单地过渡到诸如* this is an indented list item
的状态并根据那里指定的规则开始词法行吗?上面的行可以被分类为例如一个序列
State::Body
对此有何想法?
我正在Rust中开发一个reStructuredText编译器,并且需要一些有关如何在具有递归结构的语言中构建词汇的建议。例如...
我对rST不太了解。但是您说它具有“递归”结构。如果是这种情况,您就不能仅使用状态机或正则表达式甚至词法生成器来完全作为递归结构