[問題] lex的問題

看板C_and_CPP作者 (ㄆㄆ)時間11年前 (2012/09/29 01:41), 編輯推噓1(1034)
留言35則, 5人參與, 最新討論串1/1
請問在lex裡面 regex的規則如果其中有兩條 _name { //do A } _([^0-9])+= { //do B } 我如果想要抓 _name 這個字串的時候 而input裡面有 _name= lex會用第二個規則去match... 請問在lex裡面 我想抓_開頭的特定字串 例如 _name 但是 _name 有時候後面後緊接一個 = 有時候沒有 遇到 _name 的時候 我想match到等號之前就好 其他時候以 _開頭的字串 不是 _name的時候 就讓他match到= 請問這個規則要怎樣寫比較好呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.126.125.176

09/29 01:43, , 1F
打 lex 比較聽的懂
09/29 01:43, 1F

09/29 01:46, , 2F
喔喔... 那我改一下標題好了
09/29 01:46, 2F
※ 編輯: EntHeEnd 來自: 59.126.125.176 (09/29 01:46)

09/29 01:48, , 3F
阿 該不會是 新增一個 _name= 規則和_name做同一件事...
09/29 01:48, 3F

09/29 01:48, , 4F
這樣吧...
09/29 01:48, 4F

09/29 01:50, , 5F
我試著用 Flex + Bison 寫parser好像沒有比用sscanf暴力
09/29 01:50, 5F

09/29 01:50, , 6F
parse快(if + else if...) 請問有什麼可以注意的地方嗎@@
09/29 01:50, 6F

09/29 01:52, , 7F
另外 上面說的Flex和Bison 應該就是lex yacc...吧...大概
09/29 01:52, 7F

09/29 01:52, , 8F
相關的lib
09/29 01:52, 8F

09/29 01:54, , 9F
理論上用 lex + yacc應該可以linear time 而sscanf 用
09/29 01:54, 9F

09/29 01:54, , 10F
if{}else if{}... 應該是polynomial時間
09/29 01:54, 10F

09/29 01:54, , 11F
可是跑起來 速度差不多... 不知道該怎麼改善比較好...
09/29 01:54, 11F
※ 編輯: EntHeEnd 來自: 59.126.125.176 (09/29 01:57)

09/29 02:09, , 12F
格式很複雜嗎?沒很複雜的話手幹recursive descent parser
09/29 02:09, 12F

09/29 02:11, , 13F
= 這個丟到 yacc/bison 那邊處理比較好
09/29 02:11, 13F

09/29 02:16, , 14F
還蠻複雜的... 類似XML的樹狀結構展開的東西
09/29 02:16, 14F

09/29 02:17, , 15F
是說 = 也當成一個 token 丟過去 yacc嗎@@
09/29 02:17, 15F

09/29 02:17, , 16F
我試看看好了 不過效能為什麼和sscanf差不多QQ
09/29 02:17, 16F

09/29 02:18, , 17F
不過我之所以要用=當成一個規則的結尾是因為 這個字串想
09/29 02:18, 17F

09/29 02:19, , 18F
當成key 等號後面當 value... 不過這樣說起來...
09/29 02:19, 18F

09/29 02:20, , 19F
就是沒有match到特定token的都當成key我要再分析一下規則
09/29 02:20, 19F

09/29 02:21, , 20F
我先用recursive descent parser關鍵字看看好了 XD
09/29 02:21, 20F

09/29 02:22, , 21F
格式複雜的話先想辦法生出 BNF 吧
09/29 02:22, 21F

09/29 02:22, , 22F
格式複雜的話,手幹 recursive descent parser 有點難度呦
09/29 02:22, 22F

09/29 02:23, , 23F
喔喔 我也剛碰這方面的東西 先研究一下以上的的關鍵字XD
09/29 02:23, 23F

09/29 02:23, , 24F
恩...... 都看看 XD... 複雜是不是真的複雜也不一定理解
09/29 02:23, 24F

09/29 02:24, , 25F
的程度一樣 說不定其實沒有那麼複雜 QQ
09/29 02:24, 25F

09/29 02:24, , 26F
我先用lex yacc 寫一個會動的 一邊研究其他解法好了
09/29 02:24, 26F

09/29 02:25, , 27F
謝謝樓上的寶貴意見^^
09/29 02:25, 27F

09/29 02:33, , 28F
剛剛整理一下 的確 = 也當成token來看會好處理很多!
09/29 02:33, 28F

09/29 23:10, , 29F
那就是第二個規則中不包括_name囉
09/29 23:10, 29F

09/30 00:25, , 30F
是說_([^0-9](_name))+= 這樣@@?
09/30 00:25, 30F

09/30 00:25, , 31F
如果很多這種關鍵字...
09/30 00:25, 31F

09/30 01:35, , 32F
_([^0-9(_name)])+= 這樣才對
09/30 01:35, 32F

09/30 12:02, , 33F
_name[=]? // 等號有時出現有時不出現?
09/30 12:02, 33F

09/30 15:48, , 34F
恩恩 樓上這樣也可以 謝謝回答!
09/30 15:48, 34F

09/30 15:49, , 35F
最後我是把等號獨立一個token來處理了 這樣更一般化...
09/30 15:49, 35F
文章代碼(AID): #1GPU4pfW (C_and_CPP)