【发布时间】:2022-01-23 02:46:15
【问题描述】:
我正在尝试使用 python PLY (lex/yacc) 来解析一种名为“GRBL”的语言。 GRBL 看起来像这样:
G00 X0.0 Y0.0 Z-1.0
G01 X1.0
..
“G”代码告诉机器“走”(或移动),而坐标则告诉机器在哪里。
LEX 要求我们为每个可能的“令牌”指定一个唯一的正则表达式。
所以在这种情况下,我需要一个明确定义“G00”的正则表达式和一个明确定义“G01”等的正则表达式。
显然,一个人的第一个想法是r'G00' 等。
但是 G 代码是不精确的。 G可以是大写或小写,可以有前导零等。
(g0、G00、g001 等)
所以对于 G00 来说可能很简单:
r'[Gg]{1}0*'
对于 G01,我们可以有
r'[Gg]{1}0*1'
但这不起作用。 G00 解析正确,但 G01 给出:
LexToken(G00,'G0',3,21)
Illegal character '1'
也就是说,lex 认为 G01 是 G0 令牌,不知道如何处理“1”。 这显然是某种贪婪匹配问题。
很遗憾,我不能使用“$”终止符来指定字符串必须以“1”“结束”
我意识到这对某些人来说可能看起来很简单,但我已经做了 3 个小时了,但无法让它发挥作用!有谁知道如何解决这个问题?
【问题讨论】:
-
竞争条件是异步代码的计时问题(结果取决于两个任务运行的顺序)。这里没有什么异步的。
-
@rici 是的,但我不知道可能有“多少”前导零。而且我只在“Gg”代码上使用 {1},因为我想要 G|g(我本来可以这样做)
-
我并不是说你没有问题,只是它的术语不是“竞争条件”。
-
对使用
{1}的解释毫无意义。你可以写[Gg]0*。为什么你认为会有问题?
标签: python regex parsing race-condition ply