guard-mthaml 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +34 -0
- data/lib/guard/mthaml.rb +140 -0
- data/lib/guard/mthaml/compiler/MtHaml.php +255 -0
- data/lib/guard/mthaml/templates/Guardfile +12 -0
- data/lib/guard/mthaml/version.rb +5 -0
- data/vendor/autoload.php +7 -0
- data/vendor/coffeescript/coffeescript/LICENSE +22 -0
- data/vendor/coffeescript/coffeescript/README.md +96 -0
- data/vendor/coffeescript/coffeescript/composer.json +23 -0
- data/vendor/coffeescript/coffeescript/grammar.y +309 -0
- data/vendor/coffeescript/coffeescript/make.php +115 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/Compiler.php +76 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/Error.php +15 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/Helpers.php +116 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/Init.php +96 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/Lexer.php +1356 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/Nodes.php +105 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/Parser.php +3326 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/Rewriter.php +552 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/Scope.php +196 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/SyntaxError.php +9 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/Value.php +20 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Access.php +31 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Arr.php +69 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Assign.php +353 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Base.php +288 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Block.php +294 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Call.php +283 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Class.php +282 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Closure.php +49 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Code.php +203 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Comment.php +39 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Existence.php +42 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Extends.php +26 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/For.php +250 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/If.php +161 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/In.php +99 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Index.php +27 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Literal.php +96 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Obj.php +126 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Op.php +292 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Param.php +119 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Parens.php +45 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Range.php +225 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Return.php +56 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Slice.php +47 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Splat.php +100 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Switch.php +121 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Throw.php +37 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Try.php +79 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/Value.php +210 -0
- data/vendor/coffeescript/coffeescript/src/CoffeeScript/yy/While.php +112 -0
- data/vendor/coffeescript/coffeescript/tests/cases/arrays.coffee +77 -0
- data/vendor/coffeescript/coffeescript/tests/cases/assignment.coffee +352 -0
- data/vendor/coffeescript/coffeescript/tests/cases/booleans.coffee +21 -0
- data/vendor/coffeescript/coffeescript/tests/cases/classes.coffee +681 -0
- data/vendor/coffeescript/coffeescript/tests/cases/comments.coffee +207 -0
- data/vendor/coffeescript/coffeescript/tests/cases/compilation.coffee +72 -0
- data/vendor/coffeescript/coffeescript/tests/cases/comprehensions.coffee +501 -0
- data/vendor/coffeescript/coffeescript/tests/cases/control_flow.coffee +430 -0
- data/vendor/coffeescript/coffeescript/tests/cases/eval.coffee +29 -0
- data/vendor/coffeescript/coffeescript/tests/cases/exception_handling.coffee +102 -0
- data/vendor/coffeescript/coffeescript/tests/cases/formatting.coffee +146 -0
- data/vendor/coffeescript/coffeescript/tests/cases/function_invocation.coffee +552 -0
- data/vendor/coffeescript/coffeescript/tests/cases/functions.coffee +188 -0
- data/vendor/coffeescript/coffeescript/tests/cases/helpers.coffee +96 -0
- data/vendor/coffeescript/coffeescript/tests/cases/importing.coffee +18 -0
- data/vendor/coffeescript/coffeescript/tests/cases/interpolation.coffee +138 -0
- data/vendor/coffeescript/coffeescript/tests/cases/javascript_literals.coffee +10 -0
- data/vendor/coffeescript/coffeescript/tests/cases/numbers.coffee +76 -0
- data/vendor/coffeescript/coffeescript/tests/cases/objects.coffee +271 -0
- data/vendor/coffeescript/coffeescript/tests/cases/operators.coffee +277 -0
- data/vendor/coffeescript/coffeescript/tests/cases/option_parser.coffee +43 -0
- data/vendor/coffeescript/coffeescript/tests/cases/ranges.coffee +88 -0
- data/vendor/coffeescript/coffeescript/tests/cases/regexps.coffee +63 -0
- data/vendor/coffeescript/coffeescript/tests/cases/scope.coffee +43 -0
- data/vendor/coffeescript/coffeescript/tests/cases/slicing_and_splicing.coffee +143 -0
- data/vendor/coffeescript/coffeescript/tests/cases/soaks.coffee +134 -0
- data/vendor/coffeescript/coffeescript/tests/cases/strict.coffee +155 -0
- data/vendor/coffeescript/coffeescript/tests/cases/strings.coffee +107 -0
- data/vendor/coffeescript/coffeescript/tests/css/style.css +43 -0
- data/vendor/coffeescript/coffeescript/tests/index.php +119 -0
- data/vendor/coffeescript/coffeescript/tests/js/lib/coffeescript_1.1.1.js +8 -0
- data/vendor/coffeescript/coffeescript/tests/js/lib/coffeescript_1.2.0.js +8 -0
- data/vendor/coffeescript/coffeescript/tests/js/lib/coffeescript_1.3.0.js +8 -0
- data/vendor/coffeescript/coffeescript/tests/js/lib/coffeescript_1.3.1.js +8 -0
- data/vendor/coffeescript/coffeescript/tests/js/lib/diff.js +276 -0
- data/vendor/coffeescript/coffeescript/tests/js/main.js +123 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/LICENSE.txt +10 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/PHP/Lempar.php +948 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/PHP/ParserGenerator/Action.php +257 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/PHP/ParserGenerator/ActionTable.php +299 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/PHP/ParserGenerator/Config.php +574 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/PHP/ParserGenerator/Data.php +1857 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/PHP/ParserGenerator/Parser.php +851 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/PHP/ParserGenerator/PropagationLink.php +126 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/PHP/ParserGenerator/Rule.php +144 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/PHP/ParserGenerator/State.php +283 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/PHP/ParserGenerator/Symbol.php +288 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/PHP/ParserGenerator/cli.php +5 -0
- data/vendor/coffeescript/coffeescript/vendor/ParserGenerator/ParserGenerator.php +811 -0
- data/vendor/composer/ClassLoader.php +383 -0
- data/vendor/composer/autoload_classmap.php +9 -0
- data/vendor/composer/autoload_namespaces.php +12 -0
- data/vendor/composer/autoload_psr4.php +10 -0
- data/vendor/composer/autoload_real.php +50 -0
- data/vendor/composer/installed.json +166 -0
- data/vendor/michelf/php-markdown/License.md +36 -0
- data/vendor/michelf/php-markdown/Michelf/Markdown.inc.php +10 -0
- data/vendor/michelf/php-markdown/Michelf/Markdown.php +3117 -0
- data/vendor/michelf/php-markdown/Michelf/MarkdownExtra.inc.php +11 -0
- data/vendor/michelf/php-markdown/Michelf/MarkdownExtra.php +38 -0
- data/vendor/michelf/php-markdown/Michelf/MarkdownInterface.inc.php +9 -0
- data/vendor/michelf/php-markdown/Michelf/MarkdownInterface.php +37 -0
- data/vendor/michelf/php-markdown/Readme.md +305 -0
- data/vendor/michelf/php-markdown/Readme.php +31 -0
- data/vendor/michelf/php-markdown/composer.json +31 -0
- data/vendor/mthaml/mthaml/CHANGELOG +48 -0
- data/vendor/mthaml/mthaml/LICENSE +44 -0
- data/vendor/mthaml/mthaml/README.markdown +262 -0
- data/vendor/mthaml/mthaml/composer.json +45 -0
- data/vendor/mthaml/mthaml/docs/Makefile +153 -0
- data/vendor/mthaml/mthaml/docs/_static/mthaml.css +30 -0
- data/vendor/mthaml/mthaml/docs/_theme/mthaml/theme.conf +4 -0
- data/vendor/mthaml/mthaml/docs/conf.py +242 -0
- data/vendor/mthaml/mthaml/docs/index.rst +18 -0
- data/vendor/mthaml/mthaml/docs/twig-syntax.rst +274 -0
- data/vendor/mthaml/mthaml/examples/README.md +5 -0
- data/vendor/mthaml/mthaml/examples/autoload.php +8 -0
- data/vendor/mthaml/mthaml/examples/example-php.haml +5 -0
- data/vendor/mthaml/mthaml/examples/example-php.php +37 -0
- data/vendor/mthaml/mthaml/examples/example-twig-noext.twig +11 -0
- data/vendor/mthaml/mthaml/examples/example-twig.haml +9 -0
- data/vendor/mthaml/mthaml/examples/example-twig.php +60 -0
- data/vendor/mthaml/mthaml/examples/example.twig.haml +8 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Autoloader.php +22 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Environment.php +178 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Escaping.php +33 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Exception.php +9 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Exception/SyntaxErrorException.php +9 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/AbstractFilter.php +43 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Cdata.php +16 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/CoffeeScript.php +33 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Css.php +26 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Escaped.php +22 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/FilterInterface.php +15 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Javascript.php +26 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Less.php +27 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Less/LeafoLess.php +20 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Less/OyejorgeLess.php +23 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Markdown.php +58 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Markdown/CebeMarkdown.php +22 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Markdown/Ciconia.php +21 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Markdown/MichelfMarkdown.php +21 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Markdown/Parsedown.php +21 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Php.php +37 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Plain.php +24 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Preserve.php +19 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Scss.php +37 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Filter/Twig.php +47 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Indentation/Indentation.php +96 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Indentation/IndentationException.php +9 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Indentation/IndentationInterface.php +50 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Indentation/Undefined.php +41 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/Comment.php +71 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/Doctype.php +96 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/EscapableAbstract.php +19 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/Filter.php +51 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/Insert.php +42 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/InterpolatedString.php +73 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/NestAbstract.php +117 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/NestInterface.php +10 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/NodeAbstract.php +77 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/ObjectRefClass.php +42 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/ObjectRefId.php +42 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/Root.php +35 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/Run.php +71 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/Statement.php +45 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/Tag.php +90 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/TagAttribute.php +62 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/TagAttributeInterpolation.php +24 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/TagAttributeList.php +24 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Node/Text.php +37 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/NodeVisitor/Autoclose.php +25 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/NodeVisitor/Escaping.php +105 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/NodeVisitor/MergeAttrs.php +110 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/NodeVisitor/Midblock.php +37 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/NodeVisitor/NodeVisitorAbstract.php +226 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/NodeVisitor/NodeVisitorInterface.php +97 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/NodeVisitor/PhpRenderer.php +288 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/NodeVisitor/Printer.php +265 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/NodeVisitor/RendererAbstract.php +581 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/NodeVisitor/TwigRenderer.php +252 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Parser.php +862 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Parser/Buffer.php +147 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Runtime.php +218 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Runtime/AttributeInterpolation.php +16 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Runtime/AttributeList.php +16 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Support/Php/Executor.php +157 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Support/Twig/Extension.php +47 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Support/Twig/Lexer.php +48 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Support/Twig/Loader.php +81 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Target/Php.php +23 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Target/TargetAbstract.php +87 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Target/TargetInterface.php +12 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/Target/Twig.php +23 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/TreeBuilder.php +100 -0
- data/vendor/mthaml/mthaml/lib/MtHaml/TreeBuilderException.php +9 -0
- data/vendor/mthaml/mthaml/phpunit.xml +25 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/EnvironmentTest.php +59 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/HamlSpecTest.php +83 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/IndentationTest.php +140 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/Node/DoctypeTest.php +51 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/Node/NodeTest.php +110 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/NodeVisitor/PhpRendererTest.php +113 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/NodeVisitor/TwigRendererTest.php +68 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/NodeVisitorsTest.php +44 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/Parser/BufferTest.php +77 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/ParserTest.php +47 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/RuntimeTest.php +356 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/Support/Php/ExecutorTest.php +83 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/Support/Twig/LoaderTest.php +65 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/TestCase.php +49 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/TestCaseTest.php +50 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/Support/Php/Executor.001.haml +1 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/attr_list_php.test +20 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/attr_list_twig.test +12 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/boolean_attr_php.test +16 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/boolean_attr_twig.test +16 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/bug28_php.test +15 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/bug28_twig.test +15 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/bug42.test +13 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/bug8_twig.test +10 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/coffeescript_filter.test +31 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/comments.test +26 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/cond_cmt.test +25 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/doctype.test +18 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/doctype_html4.test +20 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/doctype_invalid.test +12 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/doctype_invalid_xhtml.test +12 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/doctype_php.test +18 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/doctype_xhtml.test +30 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/filters.test +51 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/insert_non_echo_php.test +11 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/insert_non_echo_twig.test +11 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/interpolation_in_html_attrs_php.test +31 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/interpolation_in_html_attrs_twig.test +31 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/less_filter_leafo.test +33 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/less_filter_oyejorge.test +49 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/markdown_filter_cebemarkdown.test +35 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/markdown_filter_ciconia.test +36 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/markdown_filter_michelf.test +34 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/markdown_filter_parsedown.test +31 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/markdown_optimization_filter_michelf.test +23 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/mergeattrs.test +18 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/nuke_inner_whitespace.test +77 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/nuke_outer_whitespace.test +122 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/object_ref_php.test +14 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/object_ref_twig.test +14 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/php.test +109 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/php_autoescaping.test +22 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/php_autoescaping_once.test +25 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/php_blocks.test +29 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/php_filters.test +42 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/scss_filter.test +32 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/strip_inline_comments_php.test +22 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/test.test +24 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/trailing_semicolon_php.test +14 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/try_catch_php.test +17 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/twig.test +112 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/twig_blocks.test +29 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/twig_filters.test +37 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/twig_whitespace.test +32 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/environment/whitespace.test +63 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/nodevisitors/autoclose.test +30 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/nodevisitors/escaping.test +52 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/nodevisitors/escaping_attr_once.test +52 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/nodevisitors/escaping_html_false.test +52 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/nodevisitors/mergeattrs.test +26 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/nodevisitors/midblock.test +54 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/nodevisitors/midblock_002.test +32 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/attr_list.test +14 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/attrs.test +42 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/attrs_002.test +35 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/attrs_003.test +30 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/attrs_html_linebreak.test +17 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/blocks.test +27 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/blocks_002.test +15 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/boolean_attr.test +19 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/bug28.test +15 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/bug8.test +11 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/cond_cmt.test +23 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/doctype.test +11 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/double_equal.test +7 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/empty_line_after_multiline.test +10 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_001.test +8 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_002.test +8 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_003.test +8 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_004.test +6 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_005.test +5 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_006.test +7 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_007.test +7 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_008.test +7 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_009.test +5 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_010.test +5 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_013.test +5 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_016.test +7 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_017.test +8 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_018.test +6 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_019.test +6 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/errors_020.test +5 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/filters.test +20 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/filters_002.test +19 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/filters_003.test +13 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/filters_004.test +21 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/filters_005.test +22 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/filters_006.test +23 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/insertflags.test +17 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/interpolation.test +36 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/interpolation_in_html_attrs.test +17 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/multiline.test +18 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/multiline_code.test +59 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/multiple_attr_kinds.test +47 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/non_rendered_comment.test +31 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/ns.test +11 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/object_ref.test +22 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/object_ref_error1.test +5 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/object_ref_error2.test +5 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/quotes_in_haml.test +10 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/ruby19_attrs.test +11 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/ruby_attrs_comma.test +23 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/ruby_attrs_comma_errors_001.test +5 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/ruby_attrs_comma_errors_002.test +5 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/ruby_attrs_comma_errors_003.test +5 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/standard.test +114 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/parser/tagflags.test +39 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/runtime/php_filters.test +28 -0
- data/vendor/mthaml/mthaml/test/MtHaml/Tests/fixtures/runtime/twig_filters.test +31 -0
- data/vendor/mthaml/mthaml/test/bootstrap.php +3 -0
- metadata +398 -0
@@ -0,0 +1,851 @@
|
|
1
|
+
<?php
|
2
|
+
/**
|
3
|
+
* PHP_ParserGenerator, a php 5 parser generator.
|
4
|
+
*
|
5
|
+
* This is a direct port of the Lemon parser generator, found at
|
6
|
+
* {@link http://www.hwaci.com/sw/lemon/}
|
7
|
+
*
|
8
|
+
* PHP version 5
|
9
|
+
*
|
10
|
+
* LICENSE: This source file is subject to version 3.01 of the PHP license
|
11
|
+
* that is available through the world-wide-web at the following URI:
|
12
|
+
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
|
13
|
+
* the PHP License and are unable to obtain it through the web, please
|
14
|
+
* send a note to license@php.net so we can mail you a copy immediately.
|
15
|
+
*
|
16
|
+
* @category PHP
|
17
|
+
* @package PHP_ParserGenerator
|
18
|
+
* @author Gregory Beaver <cellog@php.net>
|
19
|
+
* @copyright 2006 Gregory Beaver
|
20
|
+
* @license http://www.php.net/license/3_01.txt PHP License 3.01
|
21
|
+
* @version CVS: $Id: Parser.php 302382 2010-08-17 06:08:09Z jespino $
|
22
|
+
* @link http://pear.php.net/package/PHP_ParserGenerator
|
23
|
+
* @since File available since Release 0.1.0
|
24
|
+
*/
|
25
|
+
/**
|
26
|
+
* The grammar parser for lemon grammar files.
|
27
|
+
*
|
28
|
+
* @category PHP
|
29
|
+
* @package PHP_ParserGenerator
|
30
|
+
* @author Gregory Beaver <cellog@php.net>
|
31
|
+
* @copyright 2006 Gregory Beaver
|
32
|
+
* @license http://www.php.net/license/3_01.txt PHP License 3.01
|
33
|
+
* @link http://pear.php.net/package/PHP_ParserGenerator
|
34
|
+
* @since Class available since Release 0.1.0
|
35
|
+
*/
|
36
|
+
class PHP_ParserGenerator_Parser
|
37
|
+
{
|
38
|
+
const INITIALIZE = 1;
|
39
|
+
const WAITING_FOR_DECL_OR_RULE = 2;
|
40
|
+
const WAITING_FOR_DECL_KEYWORD = 3;
|
41
|
+
const WAITING_FOR_DECL_ARG = 4;
|
42
|
+
const WAITING_FOR_PRECEDENCE_SYMBOL = 5;
|
43
|
+
const WAITING_FOR_ARROW = 6;
|
44
|
+
const IN_RHS = 7;
|
45
|
+
const LHS_ALIAS_1 = 8;
|
46
|
+
const LHS_ALIAS_2 = 9;
|
47
|
+
const LHS_ALIAS_3 = 10;
|
48
|
+
const RHS_ALIAS_1 = 11;
|
49
|
+
const RHS_ALIAS_2 = 12;
|
50
|
+
const PRECEDENCE_MARK_1 = 13;
|
51
|
+
const PRECEDENCE_MARK_2 = 14;
|
52
|
+
const RESYNC_AFTER_RULE_ERROR = 15;
|
53
|
+
const RESYNC_AFTER_DECL_ERROR = 16;
|
54
|
+
const WAITING_FOR_DESTRUCTOR_SYMBOL = 17;
|
55
|
+
const WAITING_FOR_DATATYPE_SYMBOL = 18;
|
56
|
+
const WAITING_FOR_FALLBACK_ID = 19;
|
57
|
+
|
58
|
+
/**
|
59
|
+
* Name of the input file
|
60
|
+
*
|
61
|
+
* @var string
|
62
|
+
*/
|
63
|
+
public $filename;
|
64
|
+
/**
|
65
|
+
* Linenumber at which current token starts
|
66
|
+
* @var int
|
67
|
+
*/
|
68
|
+
public $tokenlineno;
|
69
|
+
/**
|
70
|
+
* Number of parsing errors so far
|
71
|
+
* @var int
|
72
|
+
*/
|
73
|
+
public $errorcnt;
|
74
|
+
/**
|
75
|
+
* Index of current token within the input string
|
76
|
+
* @var int
|
77
|
+
*/
|
78
|
+
public $tokenstart;
|
79
|
+
/**
|
80
|
+
* Global state vector
|
81
|
+
* @var PHP_ParserGenerator_Data
|
82
|
+
*/
|
83
|
+
public $gp;
|
84
|
+
/**
|
85
|
+
* Parser state (one of the class constants for this class)
|
86
|
+
*
|
87
|
+
* - PHP_ParserGenerator_Parser::INITIALIZE,
|
88
|
+
* - PHP_ParserGenerator_Parser::WAITING_FOR_DECL_OR_RULE,
|
89
|
+
* - PHP_ParserGenerator_Parser::WAITING_FOR_DECL_KEYWORD,
|
90
|
+
* - PHP_ParserGenerator_Parser::WAITING_FOR_DECL_ARG,
|
91
|
+
* - PHP_ParserGenerator_Parser::WAITING_FOR_PRECEDENCE_SYMBOL,
|
92
|
+
* - PHP_ParserGenerator_Parser::WAITING_FOR_ARROW,
|
93
|
+
* - PHP_ParserGenerator_Parser::IN_RHS,
|
94
|
+
* - PHP_ParserGenerator_Parser::LHS_ALIAS_1,
|
95
|
+
* - PHP_ParserGenerator_Parser::LHS_ALIAS_2,
|
96
|
+
* - PHP_ParserGenerator_Parser::LHS_ALIAS_3,
|
97
|
+
* - PHP_ParserGenerator_Parser::RHS_ALIAS_1,
|
98
|
+
* - PHP_ParserGenerator_Parser::RHS_ALIAS_2,
|
99
|
+
* - PHP_ParserGenerator_Parser::PRECEDENCE_MARK_1,
|
100
|
+
* - PHP_ParserGenerator_Parser::PRECEDENCE_MARK_2,
|
101
|
+
* - PHP_ParserGenerator_Parser::RESYNC_AFTER_RULE_ERROR,
|
102
|
+
* - PHP_ParserGenerator_Parser::RESYNC_AFTER_DECL_ERROR,
|
103
|
+
* - PHP_ParserGenerator_Parser::WAITING_FOR_DESTRUCTOR_SYMBOL,
|
104
|
+
* - PHP_ParserGenerator_Parser::WAITING_FOR_DATATYPE_SYMBOL,
|
105
|
+
* - PHP_ParserGenerator_Parser::WAITING_FOR_FALLBACK_ID
|
106
|
+
* @var int
|
107
|
+
*/
|
108
|
+
public $state;
|
109
|
+
/**
|
110
|
+
* The fallback token
|
111
|
+
* @var PHP_ParserGenerator_Symbol
|
112
|
+
*/
|
113
|
+
public $fallback;
|
114
|
+
/**
|
115
|
+
* Left-hand side of the current rule
|
116
|
+
* @var PHP_ParserGenerator_Symbol
|
117
|
+
*/
|
118
|
+
public $lhs;
|
119
|
+
/**
|
120
|
+
* Alias for the LHS
|
121
|
+
* @var string
|
122
|
+
*/
|
123
|
+
public $lhsalias;
|
124
|
+
/**
|
125
|
+
* Number of right-hand side symbols seen
|
126
|
+
* @var int
|
127
|
+
*/
|
128
|
+
public $nrhs;
|
129
|
+
/**
|
130
|
+
* Right-hand side symbols
|
131
|
+
* @var array array of {@link PHP_ParserGenerator_Symbol} objects
|
132
|
+
*/
|
133
|
+
public $rhs = array();
|
134
|
+
/**
|
135
|
+
* Aliases for each RHS symbol name (or NULL)
|
136
|
+
* @var array array of strings
|
137
|
+
*/
|
138
|
+
public $alias = array();
|
139
|
+
/**
|
140
|
+
* Previous rule parsed
|
141
|
+
* @var PHP_ParserGenerator_Rule
|
142
|
+
*/
|
143
|
+
public $prevrule;
|
144
|
+
/**
|
145
|
+
* Keyword of a declaration
|
146
|
+
*
|
147
|
+
* This is one of the %keyword keywords in the grammar file
|
148
|
+
* @var string
|
149
|
+
*/
|
150
|
+
public $declkeyword;
|
151
|
+
/**
|
152
|
+
* Where the declaration argument should be put
|
153
|
+
*
|
154
|
+
* This is assigned as a reference to an internal variable
|
155
|
+
* @var mixed
|
156
|
+
*/
|
157
|
+
public $declargslot = array();
|
158
|
+
/**
|
159
|
+
* Where the declaration linenumber is put
|
160
|
+
*
|
161
|
+
* This is assigned as a reference to an internal variable
|
162
|
+
* @var mixed
|
163
|
+
*/
|
164
|
+
public $decllnslot;
|
165
|
+
/*enum e_assoc*/
|
166
|
+
public $declassoc; /* Assign this association to decl arguments */
|
167
|
+
public $preccounter; /* Assign this precedence to decl arguments */
|
168
|
+
/**
|
169
|
+
* @var PHP_ParserGenerator_Rule
|
170
|
+
*/
|
171
|
+
public $firstrule; /* Pointer to first rule in the grammar */
|
172
|
+
/**
|
173
|
+
* @var PHP_ParserGenerator_Rule
|
174
|
+
*/
|
175
|
+
public $lastrule; /* Pointer to the most recently parsed rule */
|
176
|
+
|
177
|
+
/**
|
178
|
+
* @var PHP_ParserGenerator
|
179
|
+
*/
|
180
|
+
private $lemon;
|
181
|
+
|
182
|
+
function __construct(PHP_ParserGenerator $lem)
|
183
|
+
{
|
184
|
+
$this->lemon = $lem;
|
185
|
+
}
|
186
|
+
|
187
|
+
/**
|
188
|
+
* Run the preprocessor over the input file text. The Lemon variable
|
189
|
+
* $azDefine contains the names of all defined
|
190
|
+
* macros. This routine looks for "%ifdef" and "%ifndef" and "%endif" and
|
191
|
+
* comments them out. Text in between is also commented out as appropriate.
|
192
|
+
* @param string
|
193
|
+
*/
|
194
|
+
private function preprocess_input(&$z)
|
195
|
+
{
|
196
|
+
$lineno = $exclude = 0;
|
197
|
+
for ($i=0; $i < strlen($z); $i++) {
|
198
|
+
if ($z[$i] == "\n") {
|
199
|
+
$lineno++;
|
200
|
+
}
|
201
|
+
if ($z[$i] != '%' || ($i > 0 && $z[$i-1] != "\n")) {
|
202
|
+
continue;
|
203
|
+
}
|
204
|
+
if (substr($z, $i, 6) === "%endif" && trim($z[$i+6]) === '') {
|
205
|
+
if ($exclude) {
|
206
|
+
$exclude--;
|
207
|
+
if ($exclude === 0) {
|
208
|
+
for ($j = $start; $j < $i; $j++) {
|
209
|
+
if ($z[$j] != "\n") $z[$j] = ' ';
|
210
|
+
}
|
211
|
+
}
|
212
|
+
}
|
213
|
+
for ($j = $i; $j < strlen($z) && $z[$j] != "\n"; $j++) {
|
214
|
+
$z[$j] = ' ';
|
215
|
+
}
|
216
|
+
} elseif (substr($z, $i, 6) === "%ifdef" && trim($z[$i+6]) === '' ||
|
217
|
+
substr($z, $i, 7) === "%ifndef" && trim($z[$i+7]) === '') {
|
218
|
+
if ($exclude) {
|
219
|
+
$exclude++;
|
220
|
+
} else {
|
221
|
+
$j = $i;
|
222
|
+
$n = strtok(substr($z, $j), " \t");
|
223
|
+
$exclude = 1;
|
224
|
+
if (isset($this->lemon->azDefine[$n])) {
|
225
|
+
$exclude = 0;
|
226
|
+
}
|
227
|
+
if ($z[$i + 3]=='n') {
|
228
|
+
// this is a rather obtuse way of checking whether this is %ifndef
|
229
|
+
$exclude = !$exclude;
|
230
|
+
}
|
231
|
+
if ($exclude) {
|
232
|
+
$start = $i;
|
233
|
+
$start_lineno = $lineno;
|
234
|
+
}
|
235
|
+
}
|
236
|
+
//for ($j = $i; $j < strlen($z) && $z[$j] != "\n"; $j++) $z[$j] = ' ';
|
237
|
+
$j = strpos(substr($z, $i), "\n");
|
238
|
+
if ($j === false) {
|
239
|
+
$z = substr($z, 0, $i); // remove instead of adding ' '
|
240
|
+
} else {
|
241
|
+
$z = substr($z, 0, $i) . substr($z, $i + $j); // remove instead of adding ' '
|
242
|
+
}
|
243
|
+
}
|
244
|
+
}
|
245
|
+
if ($exclude) {
|
246
|
+
throw new Exception("unterminated %ifdef starting on line $start_lineno\n");
|
247
|
+
}
|
248
|
+
}
|
249
|
+
|
250
|
+
/**
|
251
|
+
* In spite of its name, this function is really a scanner.
|
252
|
+
*
|
253
|
+
* It reads in the entire input file (all at once) then tokenizes it.
|
254
|
+
* Each token is passed to the function "parseonetoken" which builds all
|
255
|
+
* the appropriate data structures in the global state vector "gp".
|
256
|
+
* @param PHP_ParserGenerator_Data
|
257
|
+
*/
|
258
|
+
function Parse(PHP_ParserGenerator_Data $gp)
|
259
|
+
{
|
260
|
+
$startline = 0;
|
261
|
+
|
262
|
+
$this->gp = $gp;
|
263
|
+
$this->filename = $gp->filename;
|
264
|
+
$this->errorcnt = 0;
|
265
|
+
$this->state = self::INITIALIZE;
|
266
|
+
|
267
|
+
/* Begin by reading the input file */
|
268
|
+
$filebuf = file_get_contents($this->filename);
|
269
|
+
if (!$filebuf) {
|
270
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, 0, "Can't open this file for reading.");
|
271
|
+
$gp->errorcnt++;
|
272
|
+
return;
|
273
|
+
}
|
274
|
+
if (filesize($this->filename) != strlen($filebuf)) {
|
275
|
+
ErrorMsg($this->filename, 0, "Can't read in all %d bytes of this file.",
|
276
|
+
filesize($this->filename));
|
277
|
+
$gp->errorcnt++;
|
278
|
+
return;
|
279
|
+
}
|
280
|
+
|
281
|
+
/* Make an initial pass through the file to handle %ifdef and %ifndef */
|
282
|
+
$this->preprocess_input($filebuf);
|
283
|
+
|
284
|
+
/* Now scan the text of the input file */
|
285
|
+
$lineno = 1;
|
286
|
+
for ($cp = 0, $c = $filebuf[0]; $cp < strlen($filebuf); $cp++) {
|
287
|
+
$c = $filebuf[$cp];
|
288
|
+
if ($c == "\n") $lineno++; /* Keep track of the line number */
|
289
|
+
if (trim($c) === '') {
|
290
|
+
continue;
|
291
|
+
} /* Skip all white space */
|
292
|
+
if ($filebuf[$cp] == '/' && ($cp + 1 < strlen($filebuf)) && $filebuf[$cp + 1] == '/') {
|
293
|
+
/* Skip C++ style comments */
|
294
|
+
$cp += 2;
|
295
|
+
$z = strpos(substr($filebuf, $cp), "\n");
|
296
|
+
if ($z === false) {
|
297
|
+
$cp = strlen($filebuf);
|
298
|
+
break;
|
299
|
+
}
|
300
|
+
$lineno++;
|
301
|
+
$cp += $z;
|
302
|
+
continue;
|
303
|
+
}
|
304
|
+
if ($filebuf[$cp] == '/' && ($cp + 1 < strlen($filebuf)) && $filebuf[$cp + 1] == '*') {
|
305
|
+
/* Skip C style comments */
|
306
|
+
$cp += 2;
|
307
|
+
$z = strpos(substr($filebuf, $cp), '*/');
|
308
|
+
if ($z !== false) {
|
309
|
+
$lineno += count(explode("\n", substr($filebuf, $cp, $z))) - 1;
|
310
|
+
}
|
311
|
+
$cp += $z + 1;
|
312
|
+
continue;
|
313
|
+
}
|
314
|
+
$this->tokenstart = $cp; /* Mark the beginning of the token */
|
315
|
+
$this->tokenlineno = $lineno; /* Linenumber on which token begins */
|
316
|
+
if ($filebuf[$cp] == '"') { /* String literals */
|
317
|
+
$cp++;
|
318
|
+
$oldcp = $cp;
|
319
|
+
$test = strpos(substr($filebuf, $cp), '"');
|
320
|
+
if ($test === false) {
|
321
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $startline,
|
322
|
+
"String starting on this line is not terminated before the end of the file.");
|
323
|
+
$this->errorcnt++;
|
324
|
+
$nextcp = $cp = strlen($filebuf);
|
325
|
+
} else {
|
326
|
+
$cp += $test;
|
327
|
+
$nextcp = $cp + 1;
|
328
|
+
}
|
329
|
+
$lineno += count(explode("\n", substr($filebuf, $oldcp, $cp - $oldcp))) - 1;
|
330
|
+
} elseif ($filebuf[$cp] == '{') { /* A block of C code */
|
331
|
+
$cp++;
|
332
|
+
if ($filebuf[$cp]=="}") {
|
333
|
+
$filebuf = substr($filebuf, 0, $cp)." ".substr($filebuf, $cp);
|
334
|
+
}
|
335
|
+
|
336
|
+
for ($level = 1; $cp < strlen($filebuf) && ($level > 1 || $filebuf[$cp] != '}'); $cp++) {
|
337
|
+
if ($filebuf[$cp] == "\n") {
|
338
|
+
$lineno++;
|
339
|
+
} elseif ($filebuf[$cp] == '{') {
|
340
|
+
$level++;
|
341
|
+
} elseif ($filebuf[$cp] == '}') {
|
342
|
+
$level--;
|
343
|
+
} elseif ($filebuf[$cp] == '/' && $filebuf[$cp + 1] == '*') {
|
344
|
+
/* Skip comments */
|
345
|
+
$cp += 2;
|
346
|
+
$z = strpos(substr($filebuf, $cp), '*/');
|
347
|
+
if ($z !== false) {
|
348
|
+
$lineno += count(explode("\n", substr($filebuf, $cp, $z))) - 1;
|
349
|
+
}
|
350
|
+
$cp += $z + 2;
|
351
|
+
} elseif ($filebuf[$cp] == '/' && $filebuf[$cp + 1] == '/') {
|
352
|
+
/* Skip C++ style comments too */
|
353
|
+
$cp += 2;
|
354
|
+
$z = strpos(substr($filebuf, $cp), "\n");
|
355
|
+
if ($z === false) {
|
356
|
+
$cp = strlen($filebuf);
|
357
|
+
break;
|
358
|
+
} else {
|
359
|
+
$lineno++;
|
360
|
+
}
|
361
|
+
$cp += $z;
|
362
|
+
} elseif ($filebuf[$cp] == "'" || $filebuf[$cp] == '"') {
|
363
|
+
/* String a character literals */
|
364
|
+
$startchar = $filebuf[$cp];
|
365
|
+
$prevc = 0;
|
366
|
+
for ($cp++; $cp < strlen($filebuf) && ($filebuf[$cp] != $startchar || $prevc === '\\'); $cp++) {
|
367
|
+
if ($filebuf[$cp] == "\n") {
|
368
|
+
$lineno++;
|
369
|
+
}
|
370
|
+
if ($prevc === '\\') {
|
371
|
+
$prevc = 0;
|
372
|
+
} else {
|
373
|
+
$prevc = $filebuf[$cp];
|
374
|
+
}
|
375
|
+
}
|
376
|
+
}
|
377
|
+
}
|
378
|
+
if ($cp >= strlen($filebuf)) {
|
379
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
380
|
+
"PHP code starting on this line is not terminated before the end of the file.");
|
381
|
+
$this->errorcnt++;
|
382
|
+
$nextcp = $cp;
|
383
|
+
} else {
|
384
|
+
$nextcp = $cp + 1;
|
385
|
+
}
|
386
|
+
} elseif (preg_match('/[a-zA-Z0-9]/', $filebuf[$cp])) {
|
387
|
+
/* Identifiers */
|
388
|
+
preg_match('/[a-zA-Z0-9_]+/', substr($filebuf, $cp), $preg_results);
|
389
|
+
$cp += strlen($preg_results[0]);
|
390
|
+
$nextcp = $cp;
|
391
|
+
} elseif ($filebuf[$cp] == ':' && $filebuf[$cp + 1] == ':' &&
|
392
|
+
$filebuf[$cp + 2] == '=') {
|
393
|
+
/* The operator "::=" */
|
394
|
+
$cp += 3;
|
395
|
+
$nextcp = $cp;
|
396
|
+
} elseif (($filebuf[$cp] == '/' || $filebuf[$cp] == '|') &&
|
397
|
+
preg_match('/[a-zA-Z]/', $filebuf[$cp + 1])) {
|
398
|
+
$cp += 2;
|
399
|
+
preg_match('/[a-zA-Z0-9_]+/', substr($filebuf, $cp), $preg_results);
|
400
|
+
$cp += strlen($preg_results[0]);
|
401
|
+
$nextcp = $cp;
|
402
|
+
} else {
|
403
|
+
/* All other (one character) operators */
|
404
|
+
$cp ++;
|
405
|
+
$nextcp = $cp;
|
406
|
+
}
|
407
|
+
$this->parseonetoken(substr($filebuf, $this->tokenstart,
|
408
|
+
$cp - $this->tokenstart)); /* Parse the token */
|
409
|
+
$cp = $nextcp - 1;
|
410
|
+
}
|
411
|
+
$gp->rule = $this->firstrule;
|
412
|
+
$gp->errorcnt = $this->errorcnt;
|
413
|
+
}
|
414
|
+
|
415
|
+
/**
|
416
|
+
* Parse a single token
|
417
|
+
* @param string token
|
418
|
+
*/
|
419
|
+
function parseonetoken($token)
|
420
|
+
{
|
421
|
+
$x = $token;
|
422
|
+
$this->a = 0; // for referencing in WAITING_FOR_DECL_KEYWORD
|
423
|
+
if (PHP_ParserGenerator::DEBUG) {
|
424
|
+
printf("%s:%d: Token=[%s] state=%d\n",
|
425
|
+
$this->filename, $this->tokenlineno, $token, $this->state);
|
426
|
+
}
|
427
|
+
switch ($this->state) {
|
428
|
+
case self::INITIALIZE:
|
429
|
+
$this->prevrule = 0;
|
430
|
+
$this->preccounter = 0;
|
431
|
+
$this->firstrule = $this->lastrule = 0;
|
432
|
+
$this->gp->nrule = 0;
|
433
|
+
/* Fall thru to next case */
|
434
|
+
case self::WAITING_FOR_DECL_OR_RULE:
|
435
|
+
if ($x[0] == '%') {
|
436
|
+
$this->state = self::WAITING_FOR_DECL_KEYWORD;
|
437
|
+
} elseif (preg_match('/[a-z]/', $x[0])) {
|
438
|
+
$this->lhs = PHP_ParserGenerator_Symbol::Symbol_new($x);
|
439
|
+
$this->nrhs = 0;
|
440
|
+
$this->lhsalias = 0;
|
441
|
+
$this->state = self::WAITING_FOR_ARROW;
|
442
|
+
} elseif ($x[0] == '{') {
|
443
|
+
if ($this->prevrule === 0) {
|
444
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
445
|
+
"There is no prior rule opon which to attach the code
|
446
|
+
fragment which begins on this line.");
|
447
|
+
$this->errorcnt++;
|
448
|
+
} elseif ($this->prevrule->code != 0) {
|
449
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
450
|
+
"Code fragment beginning on this line is not the first \
|
451
|
+
to follow the previous rule.");
|
452
|
+
$this->errorcnt++;
|
453
|
+
} else {
|
454
|
+
$this->prevrule->line = $this->tokenlineno;
|
455
|
+
$this->prevrule->code = substr($x, 1);
|
456
|
+
}
|
457
|
+
} elseif ($x[0] == '[') {
|
458
|
+
$this->state = self::PRECEDENCE_MARK_1;
|
459
|
+
} else {
|
460
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
461
|
+
"Token \"%s\" should be either \"%%\" or a nonterminal name.",
|
462
|
+
$x);
|
463
|
+
$this->errorcnt++;
|
464
|
+
}
|
465
|
+
break;
|
466
|
+
case self::PRECEDENCE_MARK_1:
|
467
|
+
if (!preg_match('/[A-Z]/', $x[0])) {
|
468
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
469
|
+
"The precedence symbol must be a terminal.");
|
470
|
+
$this->errorcnt++;
|
471
|
+
} elseif ($this->prevrule === 0) {
|
472
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
473
|
+
"There is no prior rule to assign precedence \"[%s]\".", $x);
|
474
|
+
$this->errorcnt++;
|
475
|
+
} elseif ($this->prevrule->precsym != 0) {
|
476
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
477
|
+
"Precedence mark on this line is not the first to follow the previous rule.");
|
478
|
+
$this->errorcnt++;
|
479
|
+
} else {
|
480
|
+
$this->prevrule->precsym = PHP_ParserGenerator_Symbol::Symbol_new($x);
|
481
|
+
}
|
482
|
+
$this->state = self::PRECEDENCE_MARK_2;
|
483
|
+
break;
|
484
|
+
case self::PRECEDENCE_MARK_2:
|
485
|
+
if ($x[0] != ']') {
|
486
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
487
|
+
"Missing \"]\" on precedence mark.");
|
488
|
+
$this->errorcnt++;
|
489
|
+
}
|
490
|
+
$this->state = self::WAITING_FOR_DECL_OR_RULE;
|
491
|
+
break;
|
492
|
+
case self::WAITING_FOR_ARROW:
|
493
|
+
if ($x[0] == ':' && $x[1] == ':' && $x[2] == '=') {
|
494
|
+
$this->state = self::IN_RHS;
|
495
|
+
} elseif ($x[0] == '(') {
|
496
|
+
$this->state = self::LHS_ALIAS_1;
|
497
|
+
} else {
|
498
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
499
|
+
"Expected to see a \":\" following the LHS symbol \"%s\".",
|
500
|
+
$this->lhs->name);
|
501
|
+
$this->errorcnt++;
|
502
|
+
$this->state = self::RESYNC_AFTER_RULE_ERROR;
|
503
|
+
}
|
504
|
+
break;
|
505
|
+
case self::LHS_ALIAS_1:
|
506
|
+
if (preg_match('/[A-Za-z]/', $x[0])) {
|
507
|
+
$this->lhsalias = $x;
|
508
|
+
$this->state = self::LHS_ALIAS_2;
|
509
|
+
} else {
|
510
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
511
|
+
"\"%s\" is not a valid alias for the LHS \"%s\"\n",
|
512
|
+
$x, $this->lhs->name);
|
513
|
+
$this->errorcnt++;
|
514
|
+
$this->state = self::RESYNC_AFTER_RULE_ERROR;
|
515
|
+
}
|
516
|
+
break;
|
517
|
+
case self::LHS_ALIAS_2:
|
518
|
+
if ($x[0] == ')') {
|
519
|
+
$this->state = self::LHS_ALIAS_3;
|
520
|
+
} else {
|
521
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
522
|
+
"Missing \")\" following LHS alias name \"%s\".",$this->lhsalias);
|
523
|
+
$this->errorcnt++;
|
524
|
+
$this->state = self::RESYNC_AFTER_RULE_ERROR;
|
525
|
+
}
|
526
|
+
break;
|
527
|
+
case self::LHS_ALIAS_3:
|
528
|
+
if ($x == '::=') {
|
529
|
+
$this->state = self::IN_RHS;
|
530
|
+
} else {
|
531
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
532
|
+
"Missing \"->\" following: \"%s(%s)\".",
|
533
|
+
$this->lhs->name, $this->lhsalias);
|
534
|
+
$this->errorcnt++;
|
535
|
+
$this->state = self::RESYNC_AFTER_RULE_ERROR;
|
536
|
+
}
|
537
|
+
break;
|
538
|
+
case self::IN_RHS:
|
539
|
+
if ($x[0] == '.') {
|
540
|
+
$rp = new PHP_ParserGenerator_Rule;
|
541
|
+
$rp->ruleline = $this->tokenlineno;
|
542
|
+
for ($i = 0; $i < $this->nrhs; $i++) {
|
543
|
+
$rp->rhs[$i] = $this->rhs[$i];
|
544
|
+
$rp->rhsalias[$i] = $this->alias[$i];
|
545
|
+
}
|
546
|
+
if (count(array_unique($rp->rhsalias)) != count($rp->rhsalias)) {
|
547
|
+
$used = array();
|
548
|
+
foreach ($rp->rhsalias as $i => $symbol) {
|
549
|
+
if (!is_string($symbol)) {
|
550
|
+
continue;
|
551
|
+
}
|
552
|
+
if (isset($used[$symbol])) {
|
553
|
+
PHP_ParserGenerator::ErrorMsg($this->filename,
|
554
|
+
$this->tokenlineno,
|
555
|
+
"RHS symbol \"%s\" used multiple times.",
|
556
|
+
$symbol);
|
557
|
+
$this->errorcnt++;
|
558
|
+
} else {
|
559
|
+
$used[$symbol] = $i;
|
560
|
+
}
|
561
|
+
}
|
562
|
+
}
|
563
|
+
$rp->lhs = $this->lhs;
|
564
|
+
$rp->lhsalias = $this->lhsalias;
|
565
|
+
$rp->nrhs = $this->nrhs;
|
566
|
+
$rp->code = 0;
|
567
|
+
$rp->precsym = 0;
|
568
|
+
$rp->index = $this->gp->nrule++;
|
569
|
+
$rp->nextlhs = $rp->lhs->rule;
|
570
|
+
$rp->lhs->rule = $rp;
|
571
|
+
$rp->next = 0;
|
572
|
+
if ($this->firstrule === 0) {
|
573
|
+
$this->firstrule = $this->lastrule = $rp;
|
574
|
+
} else {
|
575
|
+
$this->lastrule->next = $rp;
|
576
|
+
$this->lastrule = $rp;
|
577
|
+
}
|
578
|
+
$this->prevrule = $rp;
|
579
|
+
$this->state = self::WAITING_FOR_DECL_OR_RULE;
|
580
|
+
} elseif (preg_match('/[a-zA-Z]/', $x[0])) {
|
581
|
+
if ($this->nrhs >= PHP_ParserGenerator::MAXRHS) {
|
582
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
583
|
+
"Too many symbols on RHS or rule beginning at \"%s\".",
|
584
|
+
$x);
|
585
|
+
$this->errorcnt++;
|
586
|
+
$this->state = self::RESYNC_AFTER_RULE_ERROR;
|
587
|
+
} else {
|
588
|
+
if (isset($this->rhs[$this->nrhs - 1])) {
|
589
|
+
$msp = $this->rhs[$this->nrhs - 1];
|
590
|
+
if ($msp->type == PHP_ParserGenerator_Symbol::MULTITERMINAL) {
|
591
|
+
$inf = array_reduce($msp->subsym,
|
592
|
+
array($this, '_printmulti'), '');
|
593
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
594
|
+
'WARNING: symbol ' . $x . ' will not' .
|
595
|
+
' be part of previous multiterminal %s',
|
596
|
+
substr($inf, 0, strlen($inf) - 1)
|
597
|
+
);
|
598
|
+
}
|
599
|
+
}
|
600
|
+
$this->rhs[$this->nrhs] = PHP_ParserGenerator_Symbol::Symbol_new($x);
|
601
|
+
$this->alias[$this->nrhs] = 0;
|
602
|
+
$this->nrhs++;
|
603
|
+
}
|
604
|
+
} elseif (($x[0] == '|' || $x[0] == '/') && $this->nrhs > 0) {
|
605
|
+
$msp = $this->rhs[$this->nrhs - 1];
|
606
|
+
if ($msp->type != PHP_ParserGenerator_Symbol::MULTITERMINAL) {
|
607
|
+
$origsp = $msp;
|
608
|
+
$msp = new PHP_ParserGenerator_Symbol;
|
609
|
+
$msp->type = PHP_ParserGenerator_Symbol::MULTITERMINAL;
|
610
|
+
$msp->nsubsym = 1;
|
611
|
+
$msp->subsym = array($origsp);
|
612
|
+
$msp->name = $origsp->name;
|
613
|
+
$this->rhs[$this->nrhs - 1] = $msp;
|
614
|
+
}
|
615
|
+
$msp->nsubsym++;
|
616
|
+
$msp->subsym[$msp->nsubsym - 1] = PHP_ParserGenerator_Symbol::Symbol_new(substr($x, 1));
|
617
|
+
if (preg_match('/[a-z]/', $x[1]) ||
|
618
|
+
preg_match('/[a-z]/', $msp->subsym[0]->name[0])) {
|
619
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
620
|
+
"Cannot form a compound containing a non-terminal");
|
621
|
+
$this->errorcnt++;
|
622
|
+
}
|
623
|
+
} elseif ($x[0] == '(' && $this->nrhs > 0) {
|
624
|
+
$this->state = self::RHS_ALIAS_1;
|
625
|
+
} else {
|
626
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
627
|
+
"Illegal character on RHS of rule: \"%s\".", $x);
|
628
|
+
$this->errorcnt++;
|
629
|
+
$this->state = self::RESYNC_AFTER_RULE_ERROR;
|
630
|
+
}
|
631
|
+
break;
|
632
|
+
case self::RHS_ALIAS_1:
|
633
|
+
if (preg_match('/[A-Za-z]/', $x[0])) {
|
634
|
+
$this->alias[$this->nrhs - 1] = $x;
|
635
|
+
$this->state = self::RHS_ALIAS_2;
|
636
|
+
} else {
|
637
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
638
|
+
"\"%s\" is not a valid alias for the RHS symbol \"%s\"\n",
|
639
|
+
$x, $this->rhs[$this->nrhs - 1]->name);
|
640
|
+
$this->errorcnt++;
|
641
|
+
$this->state = self::RESYNC_AFTER_RULE_ERROR;
|
642
|
+
}
|
643
|
+
break;
|
644
|
+
case self::RHS_ALIAS_2:
|
645
|
+
if ($x[0] == ')') {
|
646
|
+
$this->state = self::IN_RHS;
|
647
|
+
} else {
|
648
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
649
|
+
"Missing \")\" following LHS alias name \"%s\".", $this->lhsalias);
|
650
|
+
$this->errorcnt++;
|
651
|
+
$this->state = self::RESYNC_AFTER_RULE_ERROR;
|
652
|
+
}
|
653
|
+
break;
|
654
|
+
case self::WAITING_FOR_DECL_KEYWORD:
|
655
|
+
if(preg_match('/[A-Za-z]/', $x[0])) {
|
656
|
+
$this->declkeyword = $x;
|
657
|
+
$this->declargslot = &$this->a;
|
658
|
+
$this->decllnslot = &$this->a;
|
659
|
+
$this->state = self::WAITING_FOR_DECL_ARG;
|
660
|
+
if ('name' == $x) {
|
661
|
+
$this->declargslot = &$this->gp->name;
|
662
|
+
} elseif ('include' == $x) {
|
663
|
+
$this->declargslot = &$this->gp->include_code;
|
664
|
+
$this->decllnslot = &$this->gp->includeln;
|
665
|
+
} elseif ('include_class' == $x) {
|
666
|
+
$this->declargslot = &$this->gp->include_classcode;
|
667
|
+
$this->decllnslot = &$this->gp->include_classln;
|
668
|
+
} elseif ('declare_class' == $x) {
|
669
|
+
$this->declargslot = &$this->gp->declare_classcode;
|
670
|
+
$this->decllnslot = &$this->gp->declare_classln;
|
671
|
+
} elseif ('code' == $x) {
|
672
|
+
$this->declargslot = &$this->gp->extracode;
|
673
|
+
$this->decllnslot = &$this->gp->extracodeln;
|
674
|
+
} elseif ('token_destructor' == $x) {
|
675
|
+
$this->declargslot = &$this->gp->tokendest;
|
676
|
+
$this->decllnslot = &$this->gp->tokendestln;
|
677
|
+
} elseif ('default_destructor' == $x) {
|
678
|
+
$this->declargslot = &$this->gp->vardest;
|
679
|
+
$this->decllnslot = &$this->gp->vardestln;
|
680
|
+
} elseif ('token_prefix' == $x) {
|
681
|
+
$this->declargslot = &$this->gp->tokenprefix;
|
682
|
+
} elseif ('syntax_error' == $x) {
|
683
|
+
$this->declargslot = &$this->gp->error;
|
684
|
+
$this->decllnslot = &$this->gp->errorln;
|
685
|
+
} elseif ('parse_accept' == $x) {
|
686
|
+
$this->declargslot = &$this->gp->accept;
|
687
|
+
$this->decllnslot = &$this->gp->acceptln;
|
688
|
+
} elseif ('parse_failure' == $x) {
|
689
|
+
$this->declargslot = &$this->gp->failure;
|
690
|
+
$this->decllnslot = &$this->gp->failureln;
|
691
|
+
} elseif ('stack_overflow' == $x) {
|
692
|
+
$this->declargslot = &$this->gp->overflow;
|
693
|
+
$this->decllnslot = &$this->gp->overflowln;
|
694
|
+
} elseif ('token_type' == $x) {
|
695
|
+
$this->declargslot = &$this->gp->tokentype;
|
696
|
+
} elseif ('default_type' == $x) {
|
697
|
+
$this->declargslot = &$this->gp->vartype;
|
698
|
+
} elseif ('stack_size' == $x) {
|
699
|
+
$this->declargslot = &$this->gp->stacksize;
|
700
|
+
} elseif ('start_symbol' == $x) {
|
701
|
+
$this->declargslot = &$this->gp->start;
|
702
|
+
} elseif ('left' == $x) {
|
703
|
+
$this->preccounter++;
|
704
|
+
$this->declassoc = PHP_ParserGenerator_Symbol::LEFT;
|
705
|
+
$this->state = self::WAITING_FOR_PRECEDENCE_SYMBOL;
|
706
|
+
} elseif ('right' == $x) {
|
707
|
+
$this->preccounter++;
|
708
|
+
$this->declassoc = PHP_ParserGenerator_Symbol::RIGHT;
|
709
|
+
$this->state = self::WAITING_FOR_PRECEDENCE_SYMBOL;
|
710
|
+
} elseif ('nonassoc' == $x) {
|
711
|
+
$this->preccounter++;
|
712
|
+
$this->declassoc = PHP_ParserGenerator_Symbol::NONE;
|
713
|
+
$this->state = self::WAITING_FOR_PRECEDENCE_SYMBOL;
|
714
|
+
} elseif ('destructor' == $x) {
|
715
|
+
$this->state = self::WAITING_FOR_DESTRUCTOR_SYMBOL;
|
716
|
+
} elseif ('type' == $x) {
|
717
|
+
$this->state = self::WAITING_FOR_DATATYPE_SYMBOL;
|
718
|
+
} elseif ('fallback' == $x) {
|
719
|
+
$this->fallback = 0;
|
720
|
+
$this->state = self::WAITING_FOR_FALLBACK_ID;
|
721
|
+
} else {
|
722
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
723
|
+
"Unknown declaration keyword: \"%%%s\".", $x);
|
724
|
+
$this->errorcnt++;
|
725
|
+
$this->state = self::RESYNC_AFTER_DECL_ERROR;
|
726
|
+
}
|
727
|
+
} else {
|
728
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
729
|
+
"Illegal declaration keyword: \"%s\".", $x);
|
730
|
+
$this->errorcnt++;
|
731
|
+
$this->state = self::RESYNC_AFTER_DECL_ERROR;
|
732
|
+
}
|
733
|
+
break;
|
734
|
+
case self::WAITING_FOR_DESTRUCTOR_SYMBOL:
|
735
|
+
if (!preg_match('/[A-Za-z]/', $x[0])) {
|
736
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
737
|
+
"Symbol name missing after %destructor keyword");
|
738
|
+
$this->errorcnt++;
|
739
|
+
$this->state = self::RESYNC_AFTER_DECL_ERROR;
|
740
|
+
} else {
|
741
|
+
$sp = PHP_ParserGenerator_Symbol::Symbol_new($x);
|
742
|
+
$this->declargslot = &$sp->destructor;
|
743
|
+
$this->decllnslot = &$sp->destructorln;
|
744
|
+
$this->state = self::WAITING_FOR_DECL_ARG;
|
745
|
+
}
|
746
|
+
break;
|
747
|
+
case self::WAITING_FOR_DATATYPE_SYMBOL:
|
748
|
+
if (!preg_match('/[A-Za-z]/', $x[0])) {
|
749
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
750
|
+
"Symbol name missing after %destructor keyword");
|
751
|
+
$this->errorcnt++;
|
752
|
+
$this->state = self::RESYNC_AFTER_DECL_ERROR;
|
753
|
+
} else {
|
754
|
+
$sp = PHP_ParserGenerator_Symbol::Symbol_new($x);
|
755
|
+
$this->declargslot = &$sp->datatype;
|
756
|
+
$this->state = self::WAITING_FOR_DECL_ARG;
|
757
|
+
}
|
758
|
+
break;
|
759
|
+
case self::WAITING_FOR_PRECEDENCE_SYMBOL:
|
760
|
+
if ($x[0] == '.') {
|
761
|
+
$this->state = self::WAITING_FOR_DECL_OR_RULE;
|
762
|
+
} elseif (preg_match('/[A-Z]/', $x[0])) {
|
763
|
+
$sp = PHP_ParserGenerator_Symbol::Symbol_new($x);
|
764
|
+
if ($sp->prec >= 0) {
|
765
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
766
|
+
"Symbol \"%s\" has already been given a precedence.", $x);
|
767
|
+
$this->errorcnt++;
|
768
|
+
} else {
|
769
|
+
$sp->prec = $this->preccounter;
|
770
|
+
$sp->assoc = $this->declassoc;
|
771
|
+
}
|
772
|
+
} else {
|
773
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
774
|
+
"Can't assign a precedence to \"%s\".", $x);
|
775
|
+
$this->errorcnt++;
|
776
|
+
}
|
777
|
+
break;
|
778
|
+
case self::WAITING_FOR_DECL_ARG:
|
779
|
+
if (preg_match('/[A-Za-z0-9{"]/', $x[0])) {
|
780
|
+
if ($this->declargslot != 0) {
|
781
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
782
|
+
"The argument \"%s\" to declaration \"%%%s\" is not the first.",
|
783
|
+
$x[0] == '"' ? substr($x, 1) : $x, $this->declkeyword);
|
784
|
+
$this->errorcnt++;
|
785
|
+
$this->state = self::RESYNC_AFTER_DECL_ERROR;
|
786
|
+
} else {
|
787
|
+
$this->declargslot = ($x[0] == '"' || $x[0] == '{') ? substr($x, 1) : $x;
|
788
|
+
$this->a = 1;
|
789
|
+
if (!$this->decllnslot) {
|
790
|
+
$this->decllnslot = $this->tokenlineno;
|
791
|
+
}
|
792
|
+
$this->state = self::WAITING_FOR_DECL_OR_RULE;
|
793
|
+
}
|
794
|
+
} else {
|
795
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
796
|
+
"Illegal argument to %%%s: %s",$this->declkeyword, $x);
|
797
|
+
$this->errorcnt++;
|
798
|
+
$this->state = self::RESYNC_AFTER_DECL_ERROR;
|
799
|
+
}
|
800
|
+
break;
|
801
|
+
case self::WAITING_FOR_FALLBACK_ID:
|
802
|
+
if ($x[0] == '.') {
|
803
|
+
$this->state = self::WAITING_FOR_DECL_OR_RULE;
|
804
|
+
} elseif (!preg_match('/[A-Z]/', $x[0])) {
|
805
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
806
|
+
"%%fallback argument \"%s\" should be a token", $x);
|
807
|
+
$this->errorcnt++;
|
808
|
+
} else {
|
809
|
+
$sp = PHP_ParserGenerator_Symbol::Symbol_new($x);
|
810
|
+
if ($this->fallback === 0) {
|
811
|
+
$this->fallback = $sp;
|
812
|
+
} elseif (is_object($sp->fallback)) {
|
813
|
+
PHP_ParserGenerator::ErrorMsg($this->filename, $this->tokenlineno,
|
814
|
+
"More than one fallback assigned to token %s", $x);
|
815
|
+
$this->errorcnt++;
|
816
|
+
} else {
|
817
|
+
$sp->fallback = $this->fallback;
|
818
|
+
$this->gp->has_fallback = 1;
|
819
|
+
}
|
820
|
+
}
|
821
|
+
break;
|
822
|
+
case self::RESYNC_AFTER_RULE_ERROR:
|
823
|
+
/* if ($x[0] == '.') $this->state = self::WAITING_FOR_DECL_OR_RULE;
|
824
|
+
** break; */
|
825
|
+
case self::RESYNC_AFTER_DECL_ERROR:
|
826
|
+
if ($x[0] == '.') {
|
827
|
+
$this->state = self::WAITING_FOR_DECL_OR_RULE;
|
828
|
+
}
|
829
|
+
if ($x[0] == '%') {
|
830
|
+
$this->state = self::WAITING_FOR_DECL_KEYWORD;
|
831
|
+
}
|
832
|
+
break;
|
833
|
+
}
|
834
|
+
}
|
835
|
+
|
836
|
+
/**
|
837
|
+
* return a descriptive string for a multi-terminal token.
|
838
|
+
*
|
839
|
+
* @param string $a
|
840
|
+
* @param string $b
|
841
|
+
* @return string
|
842
|
+
*/
|
843
|
+
private function _printmulti($a, $b)
|
844
|
+
{
|
845
|
+
if (!$a) {
|
846
|
+
$a = '';
|
847
|
+
}
|
848
|
+
$a .= $b->name . '|';
|
849
|
+
return $a;
|
850
|
+
}
|
851
|
+
}
|