亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2644 | 回復(fù): 9
打印 上一主題 下一主題

求Perl語法解析庫及工具推薦 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-11-08 11:49 |只看該作者 |倒序?yàn)g覽
我最近需要完成幾個和語法解析相關(guān)的工具,包括一個簡單的代碼自動生成工具和一個配置文件語法解析工具。

代碼自動生成工具:
場景1:
hello,q{1-3}c{1-5}:m,l{0-2,99}
m->MUSTERNTER
l->LEGAL

生成:
hello
    MUSTERNTER
    LEGAL
        0
        1
        2
        99
    END
END

q1
    MUSTERENTER
END

q1c1
    MUSTERENTER
    LEGAL
        0
        1
        2
        99
    END
END

q1c2
    MUSTERENTER
    LEGAL
        0
        1
        2
        99
    END
END

...

我現(xiàn)在有一個手寫的腳本可以完成簡單的語法解析,但是復(fù)雜的很容易出錯;
有沒有什么工具或庫可以自動解析像c{1-3} -> c1,c2,c3的語法解析工具?

論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
2 [報告]
發(fā)表于 2010-11-08 11:55 |只看該作者
cpan Parse::RecDescent

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
3 [報告]
發(fā)表于 2010-11-08 12:09 |只看該作者
cpan Parse::RecDescent
zhlong8 發(fā)表于 2010-11-08 11:55

你錯了,樓主要的不是這個。樓主要的是一個組合枚舉的東西。

論壇徽章:
0
4 [報告]
發(fā)表于 2010-11-08 13:11 |只看該作者
回復(fù) 2# zhlong8


    先謝了,我再在cpan上扒扒看。

其實(shí)我現(xiàn)在最需要的是一個用于展開{}內(nèi)內(nèi)容的示例或者一個可以解析很弱的正則表達(dá)式的示例。

我現(xiàn)在在做的是一個自動生成語法校驗(yàn)的輔助工具,手工敲一堆的驗(yàn)證命令很是麻煩,我想先把常用的命令通過表達(dá)式展開,但是不管是perl還是bash都沒有合適的工具

我現(xiàn)在已經(jīng)做了一個枚舉語法的小工具,能夠自用,但是已經(jīng)不能再擴(kuò)展了,所以需要一個成熟的工具/庫去整合這一堆語法

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
5 [報告]
發(fā)表于 2010-11-08 13:21 |只看該作者
感覺寫一個不是很難嘛。不知道有沒有這方面的 CPAN 模塊。

論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
6 [報告]
發(fā)表于 2010-11-08 13:23 |只看該作者
的確,只看后面配置文件語法解析了。樓主這個代碼生成看不太懂規(guī)則,樓主有設(shè)計語法和轉(zhuǎn)換規(guī)則那不就是個編譯器了

論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
7 [報告]
發(fā)表于 2010-11-08 13:30 |只看該作者
本帖最后由 zhlong8 于 2010-11-08 13:34 編輯

回復(fù) 4# feiliang1983

這樣能展開{}里面的內(nèi)容,不過要看情況可能有bug
  1. sub trans;
  2. my $s = 'hello,q{1-3}c{1-5}:m,l{0-2,99}';

  3. $s =~ s/(\w\{.*?\})/trans $1/ge; #看你的轉(zhuǎn)換應(yīng)該是前面一個字符跟 {} 的形式

  4. sub trans {
  5.     my $s = shift;
  6.     # 你的展開規(guī)則
  7. }
復(fù)制代碼
總之感覺自己寫一個應(yīng)該也復(fù)雜不到哪里吧,用模塊什么的還要看一堆文檔,看完都搞定了估計

論壇徽章:
0
8 [報告]
發(fā)表于 2010-11-08 14:59 |只看該作者
回復(fù) 7# zhlong8

我需要的是一個代碼自動生成工具。

實(shí)際上我現(xiàn)在是在幫人寫一堆簡單的驗(yàn)證規(guī)則;驗(yàn)證規(guī)則中有%90以上的內(nèi)容就是:
key
    RANGE start end
    LEGAL
       1
       2
       99
   END
END

key
   LEGAL
       1
       0
   END
END
之類的東西

key的格式為q{1-25}[c{1-9}[c{1-5}]],但是如果想做的更好一點(diǎn),我想將key的格式作成更通用的模式。

我現(xiàn)在已經(jīng)完成的東西在通用性上做的很差,第一個文件可以采用
hello,world,q{1-10}c{1-5},q{11-12}c{0,1,2},q{13-19}c{0,1},q{20-25}:m
q{1-15}:l{0,1,99}
q{16-20}:l{0-7,99}
...
方式直接替換
但是來了一個新的文件,我保留的關(guān)鍵字q/c都變成了非關(guān)鍵字,結(jié)果導(dǎo)致替換完全失。蝗绻M(jìn)一步擴(kuò)張關(guān)鍵字集的話代碼量將超過我要寫的語法驗(yàn)證文件,從成本上講非常不劃算;如果我將新文件中的沖突給手動移除的話,之后的操作比用vi直接寫然后進(jìn)行字符串替換的效率只低不高;而且新的腳本能夠復(fù)用的可能性非常小,我不想去做。

現(xiàn)在我想做的是找一個能夠進(jìn)行宏解析的工具,通過定義自己的宏語法規(guī)則,完成一個類似編譯器的工具。
我不是計算機(jī)專業(yè)出身,對編譯原理不是很了解。想找一個合適的庫幫助解析語法,最好只需要填充對一個個token的回調(diào)函數(shù)。這樣就算我一個解釋腳本寫的不是很好,我也能保證在不需要對腳本做大的變動的基礎(chǔ)上完善腳本的目的。

我現(xiàn)在的問題是在cpan上我除了扒拉parser相關(guān)的庫之外還有什么方式快速找到一個適用的庫的方法。
我在cpan上找了好幾頁,目前沒有發(fā)現(xiàn)適用的package

論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
9 [報告]
發(fā)表于 2010-11-08 16:00 |只看該作者
回復(fù) 8# feiliang1983


    宏展開我只知道有個 m4,而且不會用

論壇徽章:
0
10 [報告]
發(fā)表于 2010-11-09 11:00 |只看該作者
回復(fù) 9# zhlong8

我的代碼如下:
我目前只定義了四個宏規(guī)則:
n -> 刪除MUSTENTER規(guī)則
s\d+e\d+ -> 輸出 RANGE start end規(guī)則
l{[\d+-\d+]|\d+} -> 輸出 LEGAL規(guī)則
j -> 輸出JUMPS模板

這個腳本的主要作用是在需要大量手工輸入簡單語法規(guī)則檢查(epidata)時,通過使用宏替換規(guī)則生成一個簡單的模板,然后使用一個高效的編輯器完成剩余的工作。

一個簡單的驗(yàn)證用模板輸入如下:
hello,world,s{1-5|7|9},s{good-bye|hello}:l{0|1|99}
haha,q{1-6}c{1-9|12|17|99}c{1-7}:s1e9,l{0|1}
q{7-9}c{1-9}:s1e8,j

目前簡單的替換規(guī)則語法簡單,工作良好;當(dāng)輸入行數(shù)超過1000行時比vi/notepad手工編輯效率高50%以上(腳本完成基本內(nèi)容的輸入,手工調(diào)整一下幾個跳轉(zhuǎn)規(guī)則即可)。
腳本長相相當(dāng)丑陋,繼續(xù)求可用的庫或成熟工具,最好能夠在100行以內(nèi)可以定義10組以下的宏替換規(guī)則,完成基本的宏擴(kuò)展功能;或者能夠在1000行以內(nèi),可以定義約30個關(guān)鍵字完成一個小的語法生成工具。
  1. #!/usr/bin/perl
  2. #

  3. use strict;
  4. use warnings;

  5. if (@ARGV < 2) {
  6.     print "Usage:
  7. $0 inputfile outputfile
  8.   inputfile: formated template file for qes file
  9.   outputfile: .chk file generated from inputfile\n";

  10.   exit 1;
  11. }

  12. my ($inp, $outp) = @ARGV;

  13. print "input file: $inp, output file: $outp\n";

  14. open IN, "<$inp" or die "open $inp for read failed: $!\n";
  15. open OUT, ">$outp" or die "open $outp for write failed: $!\n";

  16. sub do_second_parse(@)
  17. {
  18.     my @origs = @_;
  19.     my @keys;

  20.     foreach my $orig (@origs) {
  21.         if ($orig =~ /^([^{]*){([^}]*)}(.*)$/) {
  22.             my ($p, $m, $a) = ($1, $2, $3);
  23.             $a = "" if not defined $a;

  24.             my @sps = split(/\|/, $m);
  25.             foreach my $sp (@sps) {
  26.                 my ($start, $end) = split(/-/, $sp);
  27.                 if (not defined $end) {
  28.                     push @keys, "$p$sp$a";
  29.                 }
  30.                 else {
  31.                     if (int($end) > int($start)) {
  32.                         push @keys, map { "$p$_$a" } ($start .. $end);
  33.                     }
  34.                     else {
  35.                         push @keys, "$p$sp$a";
  36.                     }
  37.                 }
  38.             }
  39.         }
  40.         else {
  41.             push @keys, $orig;
  42.         }
  43.     }

  44.     return @keys;
  45. }

  46. sub second_parse($)
  47. {
  48.     my $fp = shift;
  49.     my @keys;

  50.     push @keys, $fp;
  51.     while ( grep {/{.*}/} @keys ) {
  52.         @keys = do_second_parse(@keys);
  53.     }

  54.     return @keys;
  55. }

  56. sub parse_key($)
  57. {
  58.     my $orig = shift;
  59.     my @first_parse = split(/,/, $orig);
  60.     my @keys = ();

  61.     foreach my $fp (@first_parse) {
  62.         push @keys, second_parse($fp);
  63.     }

  64.     return @keys;
  65. }

  66. sub parse_rules ($)
  67. {
  68.     my $orig_rule = shift;
  69.     my %rules = (
  70.         enter => "    MUSTENTER\n",
  71.         range => "",
  72.         legal => "",
  73.         jumps => "",
  74.     );

  75.     my @items = split(/,/, $orig_rule);
  76.     if (grep { /^n$/ } @items) {
  77.         enter => "";
  78.     }

  79.     my @ranges = grep { /^s\d+e\d+$/ } @items;
  80.     if (@ranges) {
  81.         my $range = $ranges[0];
  82.         my ($start, $end) = ($range =~ /^s(\d+)e(\d+)$/);
  83.         $rules{range} = "    RANGE $start $end\n";
  84.     }

  85.     my @legals = grep { /^l{.*}$/ } @items;
  86.     if (@legals) {
  87.         my $legal = $legals[0];
  88.         my ($lr) = ($legal =~ /^l{(.*)}$/);
  89.         my @bps = split(/\|/, $lr);
  90.         my @aps;

  91.         foreach my $bp (@bps) {
  92.             my ($start, $end) = split(/-/, $bp);
  93.             if (not defined $end) {
  94.                 push @aps, $bp;
  95.             }
  96.             else {
  97.                 if (int($end) > int($start)) {
  98.                     push @aps, ($start .. $end);
  99.                 }
  100.                 else {
  101.                     push @aps, $bp;
  102.                 }
  103.             }
  104.         }

  105.         $rules{legal} = "    LEGAL\n";
  106.         foreach my $ap (@aps) {
  107.             $rules{legal} .= "        $ap\n";
  108.         }
  109.         $rules{legal} .= "    END\n";
  110.     }

  111.     if (grep { /^j$/ } @items) {
  112.         $rules{jumps} .= "    JUMPS\n";
  113.         $rules{jumps} .= "        ###TODO###\n";
  114.         $rules{jumps} .= "    END\n";
  115.     }

  116.     my $res = $rules{enter};
  117.     if ($rules{range}) {
  118.         $res .= $rules{range};
  119.     }

  120.     if ($rules{legal}) {
  121.         $res .= $rules{legal};
  122.     }

  123.     if ($rules{jumps}) {
  124.         $res .= $rules{jumps};
  125.     }

  126.     return $res;
  127. }

  128. while (<IN>) {
  129.     chomp;

  130.     s/#.*$//;
  131.     s/\s*//;
  132.     next if /^$/;

  133.     my ($key, $rule) = split(/:/, $_);
  134.     my @keys  = parse_key($key);
  135.     #use Data::Dumper;
  136.     #print Dumper(@keys);
  137.     my $fmt = parse_rules($rule);
  138.    
  139.     foreach my $_key (@keys) {
  140.         print OUT "$_key\n${fmt}END\n\n";
  141.     }
  142. }
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP