我正在嘗試使用 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 個小時,但無法讓它發揮作用!有誰知道如何解決這個問題?
uj5u.com熱心網友回復:
注意:完全沒有理由{1}用正則運算式撰寫。這意味著前一個元素應該只重復一次,如果沒有重復運算子就會發生這種情況。所以它所做的只是混淆正則運算式(并減慢匹配速度)。
但這不是你的問題。您的問題可能是 Ply 應用正則運算式的順序。Ply 通過將所有模式連接成一組替代方案來創建一個單一的大型 Python 正則運算式:
(pattern1)|(pattern2)|(pattern3)|...|(patternz)
插入模式的順序很重要,因為 Python 的“正則”運算式使用有序交替運算子(使它們在數學術語中實際上是不規則的,但這是一個附帶問題)。因此,一旦某些替代匹配,甚至不會嘗試以下匹配。
層手冊定義了排序:
- 函式定義的所有標記都按照它們在詞法分析器檔案中出現的順序添加。
- 接下來通過按正則運算式長度遞減的順序對它們進行排序來添加由字串定義的標記(首先添加較長的運算式)。
我猜您正在使用函式,因此模式按檔案中的出現順序排列,因為如果它們被定義為字串,那么您的第二個模式(更長)將首先應用。但是如果沒有看到您的實際檔案,就很難確定。
在任何情況下,Ply 詞法分析器的傳統智慧是使用盡可能少的模式,更喜歡使用字典將關鍵字映射到標記。在 GRBL 的情況下,一種可能性可能是[Gg][0-9] (\.[0-9]÷)?用作模式,然后在語意動作中提取索引。
uj5u.com熱心網友回復:
您的模式[Gg]{1}0 * 是通用的,它匹配 G00 和 G01 https://regex101.com/r/gkz0Wb/1 在第二種情況下,您只剩下單個字符1。
您必須使此模式更具體,例如通過在結束模式 [Gg]{1}0*\s https://regex101.com/r/dsSFaG/1添加空白字符
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/389352.html
下一篇:在字串Js中搜索模式
