Python 不使用迭代或正则表达式查找字符串的连续子字符串的结尾
我正在尝试编写一个迭代LL(k)解析器,并且我已经很好地记录了字符串,因为它们有一个开始和结束标记,所以您可以只使用Python 不使用迭代或正则表达式查找字符串的连续子字符串的结尾,python,parsing,Python,Parsing,我正在尝试编写一个迭代LL(k)解析器,并且我已经很好地记录了字符串,因为它们有一个开始和结束标记,所以您可以只使用“”。join(标记列表[string\u start:string\u end]) 但是,数字不是,而是由.0123456789组成。它们可以出现在程序中的任何给定点上,具有任意长度,并且完全由非数字分隔 一些例子,因为这个定义很模糊: 56 123.45/! is 56 and 123.45 followed by two other tokens 565.5345.
“”。join(标记列表[string\u start:string\u end])
但是,数字不是,而是由.0123456789
组成。它们可以出现在程序中的任何给定点上,具有任意长度,并且完全由非数字分隔
一些例子,因为这个定义很模糊:
56 123.45/! is 56 and 123.45 followed by two other tokens
565.5345.345 % is 565.5345, 0.345 and two other tokens (incl. whitespace)
我试图解决的问题是解析器应该如何找出数字文本的结尾。(请注意,这是一种上下文无关、自我修改的解释语法,因此不需要进行单独的词汇分析。)
我可以并且已经通过迭代解决了这个问题:
def _next_notinst(self, atindex, subs = DIGITS):
"""return the next index of a char not in subs"""
for i, e in enumerate(self.toklist[atindex:]):
if e not in subs:
return i - len(self.toklist)
else:
break
return self.idx.v
(我不认为我需要澄清这些变量,因为这是一个非常简单的例子。)
太好了!这是可行的,但至少有两个问题:
- 对于一个数字长度为n的数字,它是O(n)。不理想*
- 此方法所属的解析器类已经在使用
循环遍历字符串的任意部分,我不希望在不需要时使用远程嵌套循环while True:
- 来自上一个项目符号:由于解析器使用任意k lookahead和skipahead
*是的,我完全知道解析器本身是O(n),但是我们也不需要catenator的数量大于O(n)。如果你不相信我的话,字符串catenator是O(1),因为它只是在程序中查找下一个未替换的
“
,然后将所有字符合并到一起。我不能对数字做同样的事情吗?由于缺乏测试,我的另一个答案实际上是错误的
我决定接受它,学习一点正则表达式,因为这是解决这个问题的唯一其他方法
适用于我想要的内容,并与以下内容相匹配:
123.43.453""
.234234!/%
但并非如此,例如:
"1233
数字可以出现在字符串分隔符中吗?@Daenyth它们可以出现,但是
“
双引号和另一个双引号之间没有\反斜杠的所有内容都是字符串。解析器会在运行时构建一个字符串范围表,因此它不会在字符串文本内跳转,并且字符串优先于数字。只有在解析器在字符串外找到数字文本时,才会调用处理数字的方法。