racc 1.4.14 → 1.4.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/Manifest.txt +50 -0
- data/ext/racc/com/headius/racc/Cparse.java +66 -23
- data/ext/racc/cparse.c +1 -1
- data/ext/racc/depend +1 -1
- data/lib/racc/info.rb +2 -2
- data/test/assets/bibtex.y +141 -0
- data/test/assets/cadenza.y +170 -0
- data/test/assets/cast.y +926 -0
- data/test/assets/csspool.y +729 -0
- data/test/assets/edtf.y +583 -0
- data/test/assets/huia.y +318 -0
- data/test/assets/journey.y +47 -0
- data/test/assets/liquor.y +313 -0
- data/test/assets/machete.y +423 -0
- data/test/assets/macruby.y +2197 -0
- data/test/assets/mediacloth.y +599 -0
- data/test/assets/mof.y +649 -0
- data/test/assets/namae.y +302 -0
- data/test/assets/nasl.y +626 -0
- data/test/assets/nokogiri-css.y +255 -0
- data/test/assets/opal.y +1807 -0
- data/test/assets/php_serialization.y +98 -0
- data/test/assets/rdblockparser.y +576 -0
- data/test/assets/rdinlineparser.y +561 -0
- data/test/assets/riml.y +665 -0
- data/test/assets/ruby18.y +1943 -0
- data/test/assets/ruby19.y +2174 -0
- data/test/assets/ruby20.y +2350 -0
- data/test/assets/ruby21.y +2359 -0
- data/test/assets/ruby22.y +2381 -0
- data/test/assets/tp_plus.y +622 -0
- data/test/assets/twowaysql.y +278 -0
- data/test/helper.rb +31 -15
- data/test/regress/bibtex +474 -0
- data/test/regress/cadenza +796 -0
- data/test/regress/cast +3425 -0
- data/test/regress/csspool +2318 -0
- data/test/regress/edtf +1794 -0
- data/test/regress/huia +1392 -0
- data/test/regress/journey +222 -0
- data/test/regress/liquor +885 -0
- data/test/regress/machete +833 -0
- data/test/regress/mediacloth +1463 -0
- data/test/regress/mof +1368 -0
- data/test/regress/namae +634 -0
- data/test/regress/nasl +2058 -0
- data/test/regress/nokogiri-css +836 -0
- data/test/regress/opal +6429 -0
- data/test/regress/php_serialization +336 -0
- data/test/regress/rdblockparser +1061 -0
- data/test/regress/rdinlineparser +1243 -0
- data/test/regress/riml +3297 -0
- data/test/regress/ruby18 +6351 -0
- data/test/regress/ruby22 +7456 -0
- data/test/regress/tp_plus +1933 -0
- data/test/regress/twowaysql +556 -0
- data/test/test_racc_command.rb +177 -0
- metadata +75 -20
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: '087cab6833c9ff39a56748e88d6774c2d4d2e89ed17bf25e5445b5d6fa445246'
         | 
| 4 | 
            +
              data.tar.gz: 124e081f970a69af82ad769e9e1bba21d77a445b57d4842c29f80cea23d4a2fb
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 4872a9290181db312d35e21c3cd23996f4c1e5766b5dc956983c3c60d374a333d6a36923852d57e5274e04036f5cd3ac85e2c7e36b2f4490ee732b38feb93aa8
         | 
| 7 | 
            +
              data.tar.gz: e013f560178621e9a3b2e90ce74bcdcbb0c023b1c09b7df6dfcb64fb6ed8a8e0dc0d7e5b674b8508506e2980b09d8e330e0e7737c662a6d403572783d4bcfbb4
         | 
    
        data/Manifest.txt
    CHANGED
    
    | @@ -56,36 +56,86 @@ sample/yyerr.y | |
| 56 56 | 
             
            setup.rb
         | 
| 57 57 | 
             
            tasks/doc.rb
         | 
| 58 58 | 
             
            tasks/email.rb
         | 
| 59 | 
            +
            test/assets/bibtex.y
         | 
| 60 | 
            +
            test/assets/cadenza.y
         | 
| 61 | 
            +
            test/assets/cast.y
         | 
| 59 62 | 
             
            test/assets/chk.y
         | 
| 60 63 | 
             
            test/assets/conf.y
         | 
| 64 | 
            +
            test/assets/csspool.y
         | 
| 61 65 | 
             
            test/assets/digraph.y
         | 
| 62 66 | 
             
            test/assets/echk.y
         | 
| 67 | 
            +
            test/assets/edtf.y
         | 
| 63 68 | 
             
            test/assets/err.y
         | 
| 64 69 | 
             
            test/assets/error_recovery.y
         | 
| 65 70 | 
             
            test/assets/expect.y
         | 
| 66 71 | 
             
            test/assets/firstline.y
         | 
| 72 | 
            +
            test/assets/huia.y
         | 
| 67 73 | 
             
            test/assets/ichk.y
         | 
| 68 74 | 
             
            test/assets/intp.y
         | 
| 75 | 
            +
            test/assets/journey.y
         | 
| 76 | 
            +
            test/assets/liquor.y
         | 
| 77 | 
            +
            test/assets/machete.y
         | 
| 78 | 
            +
            test/assets/macruby.y
         | 
| 79 | 
            +
            test/assets/mediacloth.y
         | 
| 69 80 | 
             
            test/assets/mailp.y
         | 
| 81 | 
            +
            test/assets/mof.y
         | 
| 82 | 
            +
            test/assets/namae.y
         | 
| 83 | 
            +
            test/assets/nasl.y
         | 
| 70 84 | 
             
            test/assets/newsyn.y
         | 
| 71 85 | 
             
            test/assets/noend.y
         | 
| 86 | 
            +
            test/assets/nokogiri-css.y
         | 
| 72 87 | 
             
            test/assets/nonass.y
         | 
| 73 88 | 
             
            test/assets/normal.y
         | 
| 74 89 | 
             
            test/assets/norule.y
         | 
| 75 90 | 
             
            test/assets/nullbug1.y
         | 
| 76 91 | 
             
            test/assets/nullbug2.y
         | 
| 92 | 
            +
            test/assets/opal.y
         | 
| 77 93 | 
             
            test/assets/opt.y
         | 
| 78 94 | 
             
            test/assets/percent.y
         | 
| 95 | 
            +
            test/assets/php_serialization.y
         | 
| 96 | 
            +
            test/assets/rdblockparser.y
         | 
| 97 | 
            +
            test/assets/rdinlineparser.y
         | 
| 79 98 | 
             
            test/assets/recv.y
         | 
| 99 | 
            +
            test/assets/riml.y
         | 
| 80 100 | 
             
            test/assets/rrconf.y
         | 
| 101 | 
            +
            test/assets/ruby18.y
         | 
| 102 | 
            +
            test/assets/ruby19.y
         | 
| 103 | 
            +
            test/assets/ruby20.y
         | 
| 104 | 
            +
            test/assets/ruby21.y
         | 
| 105 | 
            +
            test/assets/ruby22.y
         | 
| 81 106 | 
             
            test/assets/scan.y
         | 
| 82 107 | 
             
            test/assets/syntax.y
         | 
| 108 | 
            +
            test/assets/tp_plus.y
         | 
| 109 | 
            +
            test/assets/twowaysql.y
         | 
| 83 110 | 
             
            test/assets/unterm.y
         | 
| 84 111 | 
             
            test/assets/useless.y
         | 
| 85 112 | 
             
            test/assets/yyerr.y
         | 
| 86 113 | 
             
            test/bench.y
         | 
| 87 114 | 
             
            test/helper.rb
         | 
| 88 115 | 
             
            test/infini.y
         | 
| 116 | 
            +
            test/regress/bibtex
         | 
| 117 | 
            +
            test/regress/cadenza
         | 
| 118 | 
            +
            test/regress/cast
         | 
| 119 | 
            +
            test/regress/csspool
         | 
| 120 | 
            +
            test/regress/edtf
         | 
| 121 | 
            +
            test/regress/journey
         | 
| 122 | 
            +
            test/regress/huia
         | 
| 123 | 
            +
            test/regress/liquor
         | 
| 124 | 
            +
            test/regress/machete
         | 
| 125 | 
            +
            test/regress/mediacloth
         | 
| 126 | 
            +
            test/regress/mof
         | 
| 127 | 
            +
            test/regress/namae
         | 
| 128 | 
            +
            test/regress/nasl
         | 
| 129 | 
            +
            test/regress/nokogiri-css
         | 
| 130 | 
            +
            test/regress/opal
         | 
| 131 | 
            +
            test/regress/php_serialization
         | 
| 132 | 
            +
            test/regress/rdblockparser
         | 
| 133 | 
            +
            test/regress/rdinlineparser
         | 
| 134 | 
            +
            test/regress/riml
         | 
| 135 | 
            +
            test/regress/ruby18
         | 
| 136 | 
            +
            test/regress/ruby22
         | 
| 137 | 
            +
            test/regress/tp_plus
         | 
| 138 | 
            +
            test/regress/twowaysql
         | 
| 89 139 | 
             
            test/scandata/brace
         | 
| 90 140 | 
             
            test/scandata/gvar
         | 
| 91 141 | 
             
            test/scandata/normal
         | 
| @@ -1,3 +1,17 @@ | |
| 1 | 
            +
            /*
         | 
| 2 | 
            +
                Cparse.java -- Racc Runtime Core for JRuby
         | 
| 3 | 
            +
                
         | 
| 4 | 
            +
                Copyright (c) 2016 Charles Oliver Nutter <headius@headius.com>
         | 
| 5 | 
            +
                
         | 
| 6 | 
            +
                Ported from and distributed under the same licence as cparse.c
         | 
| 7 | 
            +
                
         | 
| 8 | 
            +
                cparse.c -- Racc Runtime Core
         | 
| 9 | 
            +
              
         | 
| 10 | 
            +
                Copyright (c) 1999-2006 Minero Aoki
         | 
| 11 | 
            +
              
         | 
| 12 | 
            +
                This library is free software.
         | 
| 13 | 
            +
                You can distribute/modify this program under the same terms of ruby.
         | 
| 14 | 
            +
            */
         | 
| 1 15 | 
             
            package com.headius.racc;
         | 
| 2 16 |  | 
| 3 17 | 
             
            import org.jruby.Ruby;
         | 
| @@ -7,6 +21,7 @@ import org.jruby.RubyClass; | |
| 7 21 | 
             
            import org.jruby.RubyContinuation;
         | 
| 8 22 | 
             
            import org.jruby.RubyFixnum;
         | 
| 9 23 | 
             
            import org.jruby.RubyHash;
         | 
| 24 | 
            +
            import org.jruby.RubyKernel;
         | 
| 10 25 | 
             
            import org.jruby.RubyModule;
         | 
| 11 26 | 
             
            import org.jruby.RubyNumeric;
         | 
| 12 27 | 
             
            import org.jruby.RubyObject;
         | 
| @@ -24,13 +39,14 @@ import org.jruby.runtime.CallSite; | |
| 24 39 | 
             
            import org.jruby.runtime.Helpers;
         | 
| 25 40 | 
             
            import org.jruby.runtime.MethodIndex;
         | 
| 26 41 | 
             
            import org.jruby.runtime.ObjectAllocator;
         | 
| 42 | 
            +
            import org.jruby.runtime.Signature;
         | 
| 27 43 | 
             
            import org.jruby.runtime.ThreadContext;
         | 
| 28 44 | 
             
            import org.jruby.runtime.Visibility;
         | 
| 29 45 | 
             
            import org.jruby.runtime.builtin.IRubyObject;
         | 
| 30 46 | 
             
            import org.jruby.runtime.load.Library;
         | 
| 31 47 |  | 
| 32 48 | 
             
            public class Cparse implements Library {
         | 
| 33 | 
            -
                public static final String RACC_VERSION = "1.4. | 
| 49 | 
            +
                public static final String RACC_VERSION = "1.4.15"; // TODO: parse from Cparse.c
         | 
| 34 50 |  | 
| 35 51 | 
             
                public enum TokenType {
         | 
| 36 52 | 
             
                    DEFAULT(-1),
         | 
| @@ -233,10 +249,6 @@ public class Cparse implements Library { | |
| 233 249 | 
             
                        shift(context, act, tok, val);
         | 
| 234 250 | 
             
                    }
         | 
| 235 251 |  | 
| 236 | 
            -
                    private int REDUCE(ThreadContext context, int act) {
         | 
| 237 | 
            -
                        return reduce(context, act);
         | 
| 238 | 
            -
                    }
         | 
| 239 | 
            -
             | 
| 240 252 | 
             
                    public void parse_main(ThreadContext context, IRubyObject tok, IRubyObject val, boolean resume) {
         | 
| 241 253 | 
             
                        Ruby runtime = context.runtime;
         | 
| 242 254 |  | 
| @@ -267,7 +279,7 @@ public class Cparse implements Library { | |
| 267 279 | 
             
                                    i = assert_integer(tmp);
         | 
| 268 280 |  | 
| 269 281 | 
             
                                    D_printf("read_next=%d\n", read_next);
         | 
| 270 | 
            -
                                    if (read_next && (this.t | 
| 282 | 
            +
                                    if (read_next && (!this.t.equals(vFINAL_TOKEN))) {
         | 
| 271 283 | 
             
                                        if (this.lex_is_iterator) {
         | 
| 272 284 | 
             
                                            D_puts("resuming...");
         | 
| 273 285 | 
             
                                            if (this.fin != 0) throw runtime.newArgumentError("token given after EOF");
         | 
| @@ -354,7 +366,21 @@ public class Cparse implements Library { | |
| 354 366 | 
             
                                    }
         | 
| 355 367 | 
             
                                    else if (act < 0 && act > -(this.reduce_n)) {
         | 
| 356 368 | 
             
                                        D_puts("reduce");
         | 
| 357 | 
            -
                                        REDUCE | 
| 369 | 
            +
                                        { // macro REDUCE
         | 
| 370 | 
            +
                                            switch (reduce(context, act)) {
         | 
| 371 | 
            +
                                                case 0: /* normal */
         | 
| 372 | 
            +
                                                    break;
         | 
| 373 | 
            +
                                                case 1: /* yyerror */
         | 
| 374 | 
            +
                                                    branch = USER_YYERROR;
         | 
| 375 | 
            +
                                                    continue BRANCH;
         | 
| 376 | 
            +
                                                case 2: /* yyaccept */
         | 
| 377 | 
            +
                                                    D_puts("u accept");
         | 
| 378 | 
            +
                                                    branch = ACCEPT;
         | 
| 379 | 
            +
                                                    continue BRANCH;
         | 
| 380 | 
            +
                                                default:
         | 
| 381 | 
            +
                                                    break;
         | 
| 382 | 
            +
                                            }
         | 
| 383 | 
            +
                                        }
         | 
| 358 384 | 
             
                                    }
         | 
| 359 385 | 
             
                                    else if (act == -(this.reduce_n)) {
         | 
| 360 386 | 
             
                                        branch = ERROR; continue BRANCH;
         | 
| @@ -367,6 +393,7 @@ public class Cparse implements Library { | |
| 367 393 | 
             
                                        throw runtime.newRaiseException(RaccBug, "[Cparse Bug] unknown act value " + act);
         | 
| 368 394 | 
             
                                    }
         | 
| 369 395 |  | 
| 396 | 
            +
                                    // fall through
         | 
| 370 397 | 
             
                                case ERROR_RECOVERED:
         | 
| 371 398 |  | 
| 372 399 | 
             
                                    if (this.debug) {
         | 
| @@ -389,9 +416,10 @@ public class Cparse implements Library { | |
| 389 416 | 
             
                                        call_onerror.call(context, this.parser, this.parser, this.t, val, this.vstack);
         | 
| 390 417 | 
             
                                    }
         | 
| 391 418 |  | 
| 419 | 
            +
                                    // fall through
         | 
| 392 420 | 
             
                                case USER_YYERROR:
         | 
| 393 421 | 
             
                                    if (this.errstatus == 3) {
         | 
| 394 | 
            -
                                        if (this.t | 
| 422 | 
            +
                                        if (this.t.equals(vFINAL_TOKEN)) {
         | 
| 395 423 | 
             
                                            this.retval = runtime.getFalse();
         | 
| 396 424 | 
             
                                            this.fin = CP_FIN_EOT;
         | 
| 397 425 | 
             
                                            return;
         | 
| @@ -464,7 +492,21 @@ public class Cparse implements Library { | |
| 464 492 | 
             
                                    }
         | 
| 465 493 | 
             
                                    else if (act < 0 && act > -(this.reduce_n)) {
         | 
| 466 494 | 
             
                                        D_puts("e reduce");
         | 
| 467 | 
            -
                                        REDUCE | 
| 495 | 
            +
                                        { // macro REDUCE
         | 
| 496 | 
            +
                                            switch (reduce(context, act)) {
         | 
| 497 | 
            +
                                                case 0: /* normal */
         | 
| 498 | 
            +
                                                    break;
         | 
| 499 | 
            +
                                                case 1: /* yyerror */
         | 
| 500 | 
            +
                                                    branch = USER_YYERROR;
         | 
| 501 | 
            +
                                                    continue BRANCH;
         | 
| 502 | 
            +
                                                case 2: /* yyaccept */
         | 
| 503 | 
            +
                                                    D_puts("u accept");
         | 
| 504 | 
            +
                                                    branch = ACCEPT;
         | 
| 505 | 
            +
                                                    continue BRANCH;
         | 
| 506 | 
            +
                                                default:
         | 
| 507 | 
            +
                                                    break;
         | 
| 508 | 
            +
                                            }
         | 
| 509 | 
            +
                                        }
         | 
| 468 510 | 
             
                                    }
         | 
| 469 511 | 
             
                                    else if (act == this.shift_n) {
         | 
| 470 512 | 
             
                                        D_puts("e accept");
         | 
| @@ -489,17 +531,18 @@ public class Cparse implements Library { | |
| 489 531 | 
             
                    }
         | 
| 490 532 |  | 
| 491 533 | 
             
                    private int reduce(ThreadContext context, int act) {
         | 
| 492 | 
            -
                        IRubyObject code;
         | 
| 493 534 | 
             
                        ruleno = -act * 3;
         | 
| 494 535 | 
             
                        IRubyObject tag = context.runtime.newSymbol("racc_jump");
         | 
| 495 | 
            -
                         | 
| 496 | 
            -
             | 
| 497 | 
            -
             | 
| 498 | 
            -
             | 
| 499 | 
            -
             | 
| 500 | 
            -
             | 
| 501 | 
            -
             | 
| 502 | 
            -
             | 
| 536 | 
            +
                        IRubyObject code = RubyKernel.rbCatch19(context, this,
         | 
| 537 | 
            +
                                tag,
         | 
| 538 | 
            +
                                CallBlock19.newCallClosure(this, getMetaClass(), Signature.NO_ARGUMENTS,
         | 
| 539 | 
            +
                                        new BlockCallback() {
         | 
| 540 | 
            +
                                            @Override
         | 
| 541 | 
            +
                                            public IRubyObject call(ThreadContext context, IRubyObject[] args, Block block) {
         | 
| 542 | 
            +
                                                return reduce0(context);
         | 
| 543 | 
            +
                                            }
         | 
| 544 | 
            +
                                        }, context));
         | 
| 545 | 
            +
                        errstatus = assert_integer(parser.getInstanceVariable(ID_ERRSTATUS));
         | 
| 503 546 | 
             
                        return assert_integer(code);
         | 
| 504 547 | 
             
                    }
         | 
| 505 548 |  | 
| @@ -527,13 +570,13 @@ public class Cparse implements Library { | |
| 527 570 | 
             
                                    /* call action */
         | 
| 528 571 | 
             
                                    if (len == 0) {
         | 
| 529 572 | 
             
                                        tmp = context.nil;
         | 
| 530 | 
            -
                                        if (mid | 
| 573 | 
            +
                                        if (!mid.equals(sym_noreduce))
         | 
| 531 574 | 
             
                                            tmp_v = runtime.newArray();
         | 
| 532 575 | 
             
                                        if (this.debug)
         | 
| 533 576 | 
             
                                            tmp_t = runtime.newArray();
         | 
| 534 577 | 
             
                                    }
         | 
| 535 578 | 
             
                                    else {
         | 
| 536 | 
            -
                                        if (mid | 
| 579 | 
            +
                                        if (!mid.equals(sym_noreduce)) {
         | 
| 537 580 | 
             
                                            tmp_v = GET_TAIL(context, this.vstack, len);
         | 
| 538 581 | 
             
                                            tmp = ((RubyArray)tmp_v).entry(0);
         | 
| 539 582 | 
             
                                        }
         | 
| @@ -547,7 +590,7 @@ public class Cparse implements Library { | |
| 547 590 | 
             
                                        }
         | 
| 548 591 | 
             
                                        CUT_TAIL(context, this.state, len);
         | 
| 549 592 | 
             
                                    }
         | 
| 550 | 
            -
                                    if (mid | 
| 593 | 
            +
                                    if (!mid.equals(sym_noreduce)) {
         | 
| 551 594 | 
             
                                        if (this.use_result_var) {
         | 
| 552 595 | 
             
                                            tmp = Helpers.invoke(context, this.parser, mid.toString(), tmp_v, this.vstack, tmp);
         | 
| 553 596 | 
             
                                        }
         | 
| @@ -590,7 +633,7 @@ public class Cparse implements Library { | |
| 590 633 | 
             
                                        D_puts("(goto) check[i] == nil");
         | 
| 591 634 | 
             
                                        branch = NOTFOUND; continue BRANCH;
         | 
| 592 635 | 
             
                                    }
         | 
| 593 | 
            -
                                    if (tmp | 
| 636 | 
            +
                                    if (!tmp.equals(runtime.newFixnum(k1))) {
         | 
| 594 637 | 
             
                                        D_puts("(goto) check[i] != table[i]");
         | 
| 595 638 | 
             
                                        branch = NOTFOUND; continue BRANCH;
         | 
| 596 639 | 
             
                                    }
         | 
| @@ -759,7 +802,7 @@ public class Cparse implements Library { | |
| 759 802 | 
             
                                }
         | 
| 760 803 | 
             
                            }, context));
         | 
| 761 804 | 
             
                        } catch (LexerUnroll maybeOurs) {
         | 
| 762 | 
            -
                            if (maybeOurs | 
| 805 | 
            +
                            if (maybeOurs.equals(lexerUnroll)) {
         | 
| 763 806 | 
             
                                return;
         | 
| 764 807 | 
             
                            }
         | 
| 765 808 | 
             
                        }
         | 
    
        data/ext/racc/cparse.c
    CHANGED
    
    
    
        data/ext/racc/depend
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            cparse.o: cparse.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h
         | 
| 1 | 
            +
            cparse.o: cparse.c $(hdrdir)/ruby/ruby.h $(topdir)/config.h $(hdrdir)/ruby/defines.h
         | 
    
        data/lib/racc/info.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            #
         | 
| 2 | 
            -
            # $Id:  | 
| 2 | 
            +
            # $Id: cb493ec682225ae384145f255590797788f7ef12 $
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # Copyright (c) 1999-2006 Minero Aoki
         | 
| 5 5 | 
             
            #
         | 
| @@ -10,7 +10,7 @@ | |
| 10 10 | 
             
            #
         | 
| 11 11 |  | 
| 12 12 | 
             
            module Racc
         | 
| 13 | 
            -
              VERSION   = '1.4. | 
| 13 | 
            +
              VERSION   = '1.4.15'
         | 
| 14 14 | 
             
              Version = VERSION
         | 
| 15 15 | 
             
              Copyright = 'Copyright (c) 1999-2006 Minero Aoki'
         | 
| 16 16 | 
             
            end
         | 
| @@ -0,0 +1,141 @@ | |
| 1 | 
            +
            #--
         | 
| 2 | 
            +
            # BibTeX-Ruby
         | 
| 3 | 
            +
            # Copyright (C) 2010-2011  Sylvester Keil <http://sylvester.keil.or.at>
         | 
| 4 | 
            +
            #
         | 
| 5 | 
            +
            # This program is free software: you can redistribute it and/or modify
         | 
| 6 | 
            +
            # it under the terms of the GNU General Public License as published by
         | 
| 7 | 
            +
            # the Free Software Foundation, either version 3 of the License, or
         | 
| 8 | 
            +
            # (at your option) any later version.
         | 
| 9 | 
            +
            #
         | 
| 10 | 
            +
            # This program is distributed in the hope that it will be useful,
         | 
| 11 | 
            +
            # but WITHOUT ANY WARRANTY; without even the implied warranty of
         | 
| 12 | 
            +
            # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
         | 
| 13 | 
            +
            # GNU General Public License for more details.
         | 
| 14 | 
            +
            #
         | 
| 15 | 
            +
            # You should have received a copy of the GNU General Public License
         | 
| 16 | 
            +
            # along with this program.  If not, see <http://www.gnu.org/licenses/>.
         | 
| 17 | 
            +
            #++
         | 
| 18 | 
            +
            #
         | 
| 19 | 
            +
            # A BibTeX grammar for the parser generator +racc+
         | 
| 20 | 
            +
            #
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            # -*- racc -*-
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            class BibTeX::Parser
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            token AT COMMA COMMENT CONTENT ERROR EQ LBRACE META_CONTENT KEY
         | 
| 27 | 
            +
                  NAME NUMBER PREAMBLE RBRACE SHARP STRING STRING_LITERAL
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            expect 0
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            rule
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              bibliography : /* empty */                       { result = BibTeX::Bibliography.new(@options) }
         | 
| 34 | 
            +
                           | objects                           { result = val[0] }
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              objects : object                                 { result = BibTeX::Bibliography.new(@options) << val[0] }
         | 
| 37 | 
            +
                      | objects object                         { result << val[1] }
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              object : AT at_object                            { result = val[1] }
         | 
| 40 | 
            +
                     | META_CONTENT                            { result = BibTeX::MetaContent.new(val[0]) }
         | 
| 41 | 
            +
                     | ERROR                                   { result = BibTeX::Error.new(val[0]) }
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              at_object : comment                              { result = val[0] }
         | 
| 44 | 
            +
                        | string                               { result = val[0] }
         | 
| 45 | 
            +
                        | preamble                             { result = val[0] }
         | 
| 46 | 
            +
                        | entry                                { result = val[0] }
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              comment : COMMENT LBRACE content RBRACE          { result = BibTeX::Comment.new(val[2]) }
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              content : /* empty */                            { result = '' }
         | 
| 51 | 
            +
                      | CONTENT                                { result = val[0] }
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              preamble : PREAMBLE LBRACE string_value RBRACE   { result = BibTeX::Preamble.new(val[2]) }
         | 
| 54 | 
            +
             | 
| 55 | 
            +
              string : STRING LBRACE string_assignment RBRACE  { result = BibTeX::String.new(val[2][0],val[2][1]); }
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              string_assignment : NAME EQ string_value         { result = [val[0].downcase.to_sym, val[2]] }
         | 
| 58 | 
            +
             | 
| 59 | 
            +
              string_value : string_literal                    { result = [val[0]] }
         | 
| 60 | 
            +
                           | string_value SHARP string_literal { result << val[2] }
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              string_literal : NAME                            { result = val[0].downcase.to_sym }
         | 
| 63 | 
            +
                             | LBRACE content RBRACE           { result = val[1] }
         | 
| 64 | 
            +
                             | STRING_LITERAL                  { result = val[0] }
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              entry : entry_head assignments RBRACE            { result = val[0] << val[1] }
         | 
| 67 | 
            +
                    | entry_head assignments COMMA RBRACE      { result = val[0] << val[1] }
         | 
| 68 | 
            +
                    | entry_head RBRACE                        { result = val[0] }
         | 
| 69 | 
            +
             | 
| 70 | 
            +
              entry_head : NAME LBRACE opt_key                 { result = BibTeX::Entry.new(:bibtex_type => val[0].downcase.to_sym, :bibtex_key => val[2]) }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              opt_key :                                        { missing_key }
         | 
| 73 | 
            +
                      | KEY
         | 
| 74 | 
            +
             | 
| 75 | 
            +
              assignments : assignment                         { result = val[0] }
         | 
| 76 | 
            +
                          | assignments COMMA assignment       { result.merge!(val[2]) }
         | 
| 77 | 
            +
             | 
| 78 | 
            +
              assignment : NAME EQ value                       { result = { val[0].downcase.to_sym => val[2] } }
         | 
| 79 | 
            +
             | 
| 80 | 
            +
              value : string_value                             { result = val[0] }
         | 
| 81 | 
            +
                    | NUMBER                                   { result = val[0] }
         | 
| 82 | 
            +
             | 
| 83 | 
            +
            end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
            ---- header
         | 
| 86 | 
            +
            require 'bibtex/lexer'
         | 
| 87 | 
            +
             | 
| 88 | 
            +
            ---- inner
         | 
| 89 | 
            +
             | 
| 90 | 
            +
              attr_reader :lexer, :options
         | 
| 91 | 
            +
             | 
| 92 | 
            +
              @defaults = {
         | 
| 93 | 
            +
                :include => [:errors],
         | 
| 94 | 
            +
                :allow_missing_keys => false,
         | 
| 95 | 
            +
                :debug => false
         | 
| 96 | 
            +
              }.freeze
         | 
| 97 | 
            +
             | 
| 98 | 
            +
              class << self
         | 
| 99 | 
            +
                attr_reader :defaults
         | 
| 100 | 
            +
              end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
              def initialize(options = {})
         | 
| 103 | 
            +
                @options = Parser.defaults.merge(options)
         | 
| 104 | 
            +
                @lexer = Lexer.new(@options)
         | 
| 105 | 
            +
              end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
              def parse(input)
         | 
| 108 | 
            +
                @yydebug = debug?
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                lexer.analyse(input)
         | 
| 111 | 
            +
                do_parse
         | 
| 112 | 
            +
                #yyparse(@lexer,:each)
         | 
| 113 | 
            +
              end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
              def next_token
         | 
| 116 | 
            +
                lexer.next_token
         | 
| 117 | 
            +
              end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
              def debug?
         | 
| 120 | 
            +
                options[:debug] || ENV['DEBUG']
         | 
| 121 | 
            +
              end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
              def allow_missing_keys?
         | 
| 124 | 
            +
                options[:allow_missing_keys]
         | 
| 125 | 
            +
              end
         | 
| 126 | 
            +
             | 
| 127 | 
            +
              def missing_key
         | 
| 128 | 
            +
                unless allow_missing_keys?
         | 
| 129 | 
            +
                  raise ParseError, "Failed to parse BibTeX entry: cite-key missing"
         | 
| 130 | 
            +
                end
         | 
| 131 | 
            +
              end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
              def on_error(tid, val, vstack)
         | 
| 134 | 
            +
                message =
         | 
| 135 | 
            +
                  "Failed to parse BibTeX on value #{val.inspect} (#{token_to_str(tid) || '?'}) #{ vstack.inspect}"
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                BibTeX.log.error message
         | 
| 138 | 
            +
                raise ParseError, message
         | 
| 139 | 
            +
              end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
            # -*- racc -*-
         |