guard-mthaml 0.1.0
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 +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,288 @@
|
|
|
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:
|
|
11
|
+
*
|
|
12
|
+
* Copyright (c) 2006, Gregory Beaver <cellog@php.net>
|
|
13
|
+
* All rights reserved.
|
|
14
|
+
*
|
|
15
|
+
* Redistribution and use in source and binary forms, with or without
|
|
16
|
+
* modification, are permitted provided that the following conditions
|
|
17
|
+
* are met:
|
|
18
|
+
*
|
|
19
|
+
* * Redistributions of source code must retain the above copyright
|
|
20
|
+
* notice, this list of conditions and the following disclaimer.
|
|
21
|
+
* * Redistributions in binary form must reproduce the above copyright
|
|
22
|
+
* notice, this list of conditions and the following disclaimer in
|
|
23
|
+
* the documentation and/or other materials provided with the distribution.
|
|
24
|
+
* * Neither the name of the PHP_ParserGenerator nor the names of its
|
|
25
|
+
* contributors may be used to endorse or promote products derived
|
|
26
|
+
* from this software without specific prior written permission.
|
|
27
|
+
*
|
|
28
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
29
|
+
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
30
|
+
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
31
|
+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
32
|
+
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
33
|
+
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
34
|
+
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
35
|
+
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
|
36
|
+
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
37
|
+
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
38
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
39
|
+
*
|
|
40
|
+
* @category PHP
|
|
41
|
+
* @package PHP_ParserGenerator
|
|
42
|
+
* @author Gregory Beaver <cellog@php.net>
|
|
43
|
+
* @copyright 2006 Gregory Beaver
|
|
44
|
+
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
|
|
45
|
+
* @version CVS: $Id: Symbol.php 302382 2010-08-17 06:08:09Z jespino $
|
|
46
|
+
* @link http://pear.php.net/package/PHP_ParserGenerator
|
|
47
|
+
* @since File available since Release 0.1.0
|
|
48
|
+
*/
|
|
49
|
+
/**
|
|
50
|
+
* Symbols (terminals and nonterminals) of the grammar are stored in this class
|
|
51
|
+
*
|
|
52
|
+
* @category PHP
|
|
53
|
+
* @package PHP_ParserGenerator
|
|
54
|
+
* @author Gregory Beaver <cellog@php.net>
|
|
55
|
+
* @copyright 2006 Gregory Beaver
|
|
56
|
+
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
|
|
57
|
+
* @version Release: @package_version@
|
|
58
|
+
* @link http://pear.php.net/package/PHP_ParserGenerator
|
|
59
|
+
* @since Class available since Release 0.1.0
|
|
60
|
+
*/
|
|
61
|
+
class PHP_ParserGenerator_Symbol
|
|
62
|
+
{
|
|
63
|
+
/**
|
|
64
|
+
* Symbols that start with a capital letter like FOO.
|
|
65
|
+
*
|
|
66
|
+
* These are tokens directly from the lexer
|
|
67
|
+
*/
|
|
68
|
+
const TERMINAL = 1;
|
|
69
|
+
/**
|
|
70
|
+
* Symbols that start with a lower-case letter like foo.
|
|
71
|
+
*
|
|
72
|
+
* These are grammar rules like "foo ::= BLAH."
|
|
73
|
+
*/
|
|
74
|
+
const NONTERMINAL = 2;
|
|
75
|
+
/**
|
|
76
|
+
* Multiple terminal symbols.
|
|
77
|
+
*
|
|
78
|
+
* These are a grammar rule that consists of several terminals like
|
|
79
|
+
* FOO|BAR|BAZ. Note that non-terminals cannot be in a multi-terminal,
|
|
80
|
+
* and a multi-terminal acts like a single terminal.
|
|
81
|
+
*
|
|
82
|
+
* "FOO|BAR FOO|BAZ" is actually two multi-terminals, FOO|BAR and FOO|BAZ.
|
|
83
|
+
*/
|
|
84
|
+
const MULTITERMINAL = 3;
|
|
85
|
+
|
|
86
|
+
const LEFT = 1;
|
|
87
|
+
const RIGHT = 2;
|
|
88
|
+
const NONE = 3;
|
|
89
|
+
const UNK = 4;
|
|
90
|
+
/**
|
|
91
|
+
* Name of the symbol
|
|
92
|
+
*
|
|
93
|
+
* @var string
|
|
94
|
+
*/
|
|
95
|
+
public $name;
|
|
96
|
+
/**
|
|
97
|
+
* Index of this symbol.
|
|
98
|
+
*
|
|
99
|
+
* This will ultimately end up representing the symbol in the generated
|
|
100
|
+
* parser
|
|
101
|
+
* @var int
|
|
102
|
+
*/
|
|
103
|
+
public $index;
|
|
104
|
+
/**
|
|
105
|
+
* Symbol type
|
|
106
|
+
*
|
|
107
|
+
* One of PHP_ParserGenerator_Symbol::TERMINAL,
|
|
108
|
+
* PHP_ParserGenerator_Symbol::NONTERMINAL or
|
|
109
|
+
* PHP_ParserGenerator_Symbol::MULTITERMINAL
|
|
110
|
+
* @var int
|
|
111
|
+
*/
|
|
112
|
+
public $type;
|
|
113
|
+
/**
|
|
114
|
+
* Linked list of rules that use this symbol, if it is a non-terminal.
|
|
115
|
+
* @var PHP_ParserGenerator_Rule
|
|
116
|
+
*/
|
|
117
|
+
public $rule;
|
|
118
|
+
/**
|
|
119
|
+
* Fallback token in case this token doesn't parse
|
|
120
|
+
* @var PHP_ParserGenerator_Symbol
|
|
121
|
+
*/
|
|
122
|
+
public $fallback;
|
|
123
|
+
/**
|
|
124
|
+
* Precendence, if defined.
|
|
125
|
+
*
|
|
126
|
+
* -1 if no unusual precedence
|
|
127
|
+
* @var int
|
|
128
|
+
*/
|
|
129
|
+
public $prec = -1;
|
|
130
|
+
/**
|
|
131
|
+
* Associativity if precedence is defined.
|
|
132
|
+
*
|
|
133
|
+
* One of PHP_ParserGenerator_Symbol::LEFT,
|
|
134
|
+
* PHP_ParserGenerator_Symbol::RIGHT, PHP_ParserGenerator_Symbol::NONE
|
|
135
|
+
* or PHP_ParserGenerator_Symbol::UNK
|
|
136
|
+
* @var unknown_type
|
|
137
|
+
*/
|
|
138
|
+
public $assoc;
|
|
139
|
+
/**
|
|
140
|
+
* First-set for all rules of this symbol
|
|
141
|
+
*
|
|
142
|
+
* @var array
|
|
143
|
+
*/
|
|
144
|
+
public $firstset;
|
|
145
|
+
/**
|
|
146
|
+
* True if this symbol is a non-terminal and can generate an empty
|
|
147
|
+
* result.
|
|
148
|
+
*
|
|
149
|
+
* For instance "foo ::= ."
|
|
150
|
+
* @var boolean
|
|
151
|
+
*/
|
|
152
|
+
public $lambda;
|
|
153
|
+
/**
|
|
154
|
+
* Code that executes whenever this symbol is popped from the stack during
|
|
155
|
+
* error processing.
|
|
156
|
+
*
|
|
157
|
+
* @var string|0
|
|
158
|
+
*/
|
|
159
|
+
public $destructor = 0;
|
|
160
|
+
/**
|
|
161
|
+
* Line number of destructor code
|
|
162
|
+
* @var int
|
|
163
|
+
*/
|
|
164
|
+
public $destructorln;
|
|
165
|
+
/**
|
|
166
|
+
* Unused relic of the C version of Lemon.
|
|
167
|
+
*
|
|
168
|
+
* The data type of information held by this object. Only used
|
|
169
|
+
* if this is a non-terminal
|
|
170
|
+
* @var string
|
|
171
|
+
*/
|
|
172
|
+
public $datatype;
|
|
173
|
+
/**
|
|
174
|
+
* Unused relic of the C version of Lemon.
|
|
175
|
+
*
|
|
176
|
+
* The data type number. In the parser, the value
|
|
177
|
+
* stack is a union. The .yy%d element of this
|
|
178
|
+
* union is the correct data type for this object
|
|
179
|
+
* @var string
|
|
180
|
+
*/
|
|
181
|
+
public $dtnum;
|
|
182
|
+
/**#@+
|
|
183
|
+
* The following fields are used by MULTITERMINALs only
|
|
184
|
+
*/
|
|
185
|
+
/**
|
|
186
|
+
* Number of terminal symbols in the MULTITERMINAL
|
|
187
|
+
*
|
|
188
|
+
* This is of course the same as count($this->subsym)
|
|
189
|
+
* @var int
|
|
190
|
+
*/
|
|
191
|
+
public $nsubsym;
|
|
192
|
+
/**
|
|
193
|
+
* Array of terminal symbols in the MULTITERMINAL
|
|
194
|
+
* @var array an array of {@link PHP_ParserGenerator_Symbol} objects
|
|
195
|
+
*/
|
|
196
|
+
public $subsym = array();
|
|
197
|
+
/**#@-*/
|
|
198
|
+
/**
|
|
199
|
+
* Singleton storage of symbols
|
|
200
|
+
*
|
|
201
|
+
* @var array an array of PHP_ParserGenerator_Symbol objects
|
|
202
|
+
*/
|
|
203
|
+
private static $_symbol_table = array();
|
|
204
|
+
/**
|
|
205
|
+
* Return a pointer to the (terminal or nonterminal) symbol "x".
|
|
206
|
+
* Create a new symbol if this is the first time "x" has been seen.
|
|
207
|
+
* (this is a singleton)
|
|
208
|
+
* @param string
|
|
209
|
+
* @return PHP_ParserGenerator_Symbol
|
|
210
|
+
*/
|
|
211
|
+
public static function Symbol_new($x)
|
|
212
|
+
{
|
|
213
|
+
if (isset(self::$_symbol_table[$x])) {
|
|
214
|
+
return self::$_symbol_table[$x];
|
|
215
|
+
}
|
|
216
|
+
$sp = new PHP_ParserGenerator_Symbol;
|
|
217
|
+
$sp->name = $x;
|
|
218
|
+
$sp->type = preg_match('/[A-Z]/', $x[0]) ? self::TERMINAL : self::NONTERMINAL;
|
|
219
|
+
$sp->rule = 0;
|
|
220
|
+
$sp->fallback = 0;
|
|
221
|
+
$sp->prec = -1;
|
|
222
|
+
$sp->assoc = self::UNK;
|
|
223
|
+
$sp->firstset = array();
|
|
224
|
+
$sp->lambda = false;
|
|
225
|
+
$sp->destructor = 0;
|
|
226
|
+
$sp->datatype = 0;
|
|
227
|
+
self::$_symbol_table[$sp->name] = $sp;
|
|
228
|
+
return $sp;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Return the number of unique symbols
|
|
233
|
+
*
|
|
234
|
+
* @return int
|
|
235
|
+
*/
|
|
236
|
+
public static function Symbol_count()
|
|
237
|
+
{
|
|
238
|
+
return count(self::$_symbol_table);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
public static function Symbol_arrayof()
|
|
242
|
+
{
|
|
243
|
+
return array_values(self::$_symbol_table);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
public static function Symbol_find($x)
|
|
247
|
+
{
|
|
248
|
+
if (isset(self::$_symbol_table[$x])) {
|
|
249
|
+
return self::$_symbol_table[$x];
|
|
250
|
+
}
|
|
251
|
+
return 0;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Sort function helper for symbols
|
|
256
|
+
*
|
|
257
|
+
* Symbols that begin with upper case letters (terminals or tokens)
|
|
258
|
+
* must sort before symbols that begin with lower case letters
|
|
259
|
+
* (non-terminals). Other than that, the order does not matter.
|
|
260
|
+
*
|
|
261
|
+
* We find experimentally that leaving the symbols in their original
|
|
262
|
+
* order (the order they appeared in the grammar file) gives the
|
|
263
|
+
* smallest parser tables in SQLite.
|
|
264
|
+
* @param PHP_ParserGenerator_Symbol
|
|
265
|
+
* @param PHP_ParserGenerator_Symbol
|
|
266
|
+
*/
|
|
267
|
+
public static function sortSymbols($a, $b)
|
|
268
|
+
{
|
|
269
|
+
$i1 = $a->index + 10000000*(ord($a->name[0]) > ord('Z'));
|
|
270
|
+
$i2 = $b->index + 10000000*(ord($b->name[0]) > ord('Z'));
|
|
271
|
+
return $i1 - $i2;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Return true if two symbols are the same.
|
|
276
|
+
*/
|
|
277
|
+
public static function same_symbol(PHP_ParserGenerator_Symbol $a, PHP_ParserGenerator_Symbol $b)
|
|
278
|
+
{
|
|
279
|
+
if ($a === $b) return 1;
|
|
280
|
+
if ($a->type != self::MULTITERMINAL) return 0;
|
|
281
|
+
if ($b->type != self::MULTITERMINAL) return 0;
|
|
282
|
+
if ($a->nsubsym != $b->nsubsym) return 0;
|
|
283
|
+
for ($i = 0; $i < $a->nsubsym; $i++) {
|
|
284
|
+
if ($a->subsym[$i] != $b->subsym[$i]) return 0;
|
|
285
|
+
}
|
|
286
|
+
return 1;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
@@ -0,0 +1,811 @@
|
|
|
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
|
+
* There are a few PHP-specific changes to the lemon parser generator.
|
|
9
|
+
*
|
|
10
|
+
* - %extra_argument is removed, as class constructor can be used to
|
|
11
|
+
* pass in extra information
|
|
12
|
+
* - %token_type and company are irrelevant in PHP, and so are removed
|
|
13
|
+
* - %declare_class is added to define the parser class name and any
|
|
14
|
+
* implements/extends information
|
|
15
|
+
* - %include_class is added to allow insertion of extra class information
|
|
16
|
+
* such as constants, a class constructor, etc.
|
|
17
|
+
*
|
|
18
|
+
* Other changes make the parser more robust, and also make reporting
|
|
19
|
+
* syntax errors simpler. Detection of expected tokens eliminates some
|
|
20
|
+
* problematic edge cases where an unexpected token could cause the parser
|
|
21
|
+
* to simply accept input.
|
|
22
|
+
*
|
|
23
|
+
* Otherwise, the file format is identical to the Lemon parser generator
|
|
24
|
+
*
|
|
25
|
+
* PHP version 5
|
|
26
|
+
*
|
|
27
|
+
* LICENSE:
|
|
28
|
+
*
|
|
29
|
+
* Copyright (c) 2006, Gregory Beaver <cellog@php.net>
|
|
30
|
+
* All rights reserved.
|
|
31
|
+
*
|
|
32
|
+
* Redistribution and use in source and binary forms, with or without
|
|
33
|
+
* modification, are permitted provided that the following conditions
|
|
34
|
+
* are met:
|
|
35
|
+
*
|
|
36
|
+
* * Redistributions of source code must retain the above copyright
|
|
37
|
+
* notice, this list of conditions and the following disclaimer.
|
|
38
|
+
* * Redistributions in binary form must reproduce the above copyright
|
|
39
|
+
* notice, this list of conditions and the following disclaimer in
|
|
40
|
+
* the documentation and/or other materials provided with the distribution.
|
|
41
|
+
* * Neither the name of the PHP_ParserGenerator nor the names of its
|
|
42
|
+
* contributors may be used to endorse or promote products derived
|
|
43
|
+
* from this software without specific prior written permission.
|
|
44
|
+
*
|
|
45
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
46
|
+
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
47
|
+
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
48
|
+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
49
|
+
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
50
|
+
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
51
|
+
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
52
|
+
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
|
53
|
+
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
54
|
+
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
55
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
56
|
+
*
|
|
57
|
+
* @category PHP
|
|
58
|
+
* @package PHP_ParserGenerator
|
|
59
|
+
* @author Gregory Beaver <cellog@php.net>
|
|
60
|
+
* @copyright 2006 Gregory Beaver
|
|
61
|
+
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
|
|
62
|
+
* @version CVS: $Id: ParserGenerator.php 302382 2010-08-17 06:08:09Z jespino $
|
|
63
|
+
* @link http://pear.php.net/package/PHP_ParserGenerator
|
|
64
|
+
* @since File available since Release 0.1.0
|
|
65
|
+
*/
|
|
66
|
+
/**#@+
|
|
67
|
+
* Basic components of the parser generator
|
|
68
|
+
*/
|
|
69
|
+
require_once 'PHP/ParserGenerator/Action.php';
|
|
70
|
+
require_once 'PHP/ParserGenerator/ActionTable.php';
|
|
71
|
+
require_once 'PHP/ParserGenerator/Config.php';
|
|
72
|
+
require_once 'PHP/ParserGenerator/Data.php';
|
|
73
|
+
require_once 'PHP/ParserGenerator/Symbol.php';
|
|
74
|
+
require_once 'PHP/ParserGenerator/Rule.php';
|
|
75
|
+
require_once 'PHP/ParserGenerator/Parser.php';
|
|
76
|
+
require_once 'PHP/ParserGenerator/PropagationLink.php';
|
|
77
|
+
require_once 'PHP/ParserGenerator/State.php';
|
|
78
|
+
/**#@-*/
|
|
79
|
+
/**
|
|
80
|
+
* The basic home class for the parser generator
|
|
81
|
+
*
|
|
82
|
+
* @category PHP
|
|
83
|
+
* @package PHP_ParserGenerator
|
|
84
|
+
* @author Gregory Beaver <cellog@php.net>
|
|
85
|
+
* @copyright 2006 Gregory Beaver
|
|
86
|
+
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
|
|
87
|
+
* @version Release: @package_version@
|
|
88
|
+
* @link http://pear.php.net/package/PHP_ParserGenerator
|
|
89
|
+
* @since Class available since Release 0.1.0
|
|
90
|
+
* @example Lempar.php
|
|
91
|
+
* @example examples/Parser.y Sample parser file format (PHP_LexerGenerator's parser)
|
|
92
|
+
* @example examples/Parser.php Sample parser file format PHP code (PHP_LexerGenerator's parser)
|
|
93
|
+
*/
|
|
94
|
+
class PHP_ParserGenerator
|
|
95
|
+
{
|
|
96
|
+
/**
|
|
97
|
+
* Set this to 1 to turn on debugging of Lemon's parsing of
|
|
98
|
+
* grammar files.
|
|
99
|
+
*/
|
|
100
|
+
const DEBUG = 0;
|
|
101
|
+
const MAXRHS = 1000;
|
|
102
|
+
const OPT_FLAG = 1, OPT_INT = 2, OPT_DBL = 3, OPT_STR = 4,
|
|
103
|
+
OPT_FFLAG = 5, OPT_FINT = 6, OPT_FDBL = 7, OPT_FSTR = 8;
|
|
104
|
+
public $azDefine = array();
|
|
105
|
+
private static $_options = array(
|
|
106
|
+
'b' => array(
|
|
107
|
+
'type' => self::OPT_FLAG,
|
|
108
|
+
'arg' => 'basisflag',
|
|
109
|
+
'message' => 'Print only the basis in report.'
|
|
110
|
+
),
|
|
111
|
+
'c' => array(
|
|
112
|
+
'type' => self::OPT_FLAG,
|
|
113
|
+
'arg' => 'compress',
|
|
114
|
+
'message' => 'Don\'t compress the action table.'
|
|
115
|
+
),
|
|
116
|
+
'D' => array(
|
|
117
|
+
'type' => self::OPT_FSTR,
|
|
118
|
+
'arg' => 'handleDOption',
|
|
119
|
+
'message' => 'Define an %ifdef macro.'
|
|
120
|
+
),
|
|
121
|
+
'g' => array(
|
|
122
|
+
'type' => self::OPT_FLAG,
|
|
123
|
+
'arg' => 'rpflag',
|
|
124
|
+
'message' => 'Print grammar without actions.'
|
|
125
|
+
),
|
|
126
|
+
'm' => array(
|
|
127
|
+
'type' => self::OPT_FLAG,
|
|
128
|
+
'arg' => 'mhflag',
|
|
129
|
+
'message' => 'Output a makeheaders compatible file'
|
|
130
|
+
),
|
|
131
|
+
'q' => array(
|
|
132
|
+
'type' => self::OPT_FLAG,
|
|
133
|
+
'arg' => 'quiet',
|
|
134
|
+
'message' => '(Quiet) Don\'t print the report file.'
|
|
135
|
+
),
|
|
136
|
+
's' => array(
|
|
137
|
+
'type' => self::OPT_FLAG,
|
|
138
|
+
'arg' => 'statistics',
|
|
139
|
+
'message' => 'Print parser stats to standard output.'
|
|
140
|
+
),
|
|
141
|
+
'x' => array(
|
|
142
|
+
'type' => self::OPT_FLAG,
|
|
143
|
+
'arg' => 'version',
|
|
144
|
+
'message' => 'Print the version number.'
|
|
145
|
+
),
|
|
146
|
+
'T' => array(
|
|
147
|
+
'type' => self::OPT_STR,
|
|
148
|
+
'arg' => 'parser_template',
|
|
149
|
+
'message' => 'Use different parser template file.'
|
|
150
|
+
)
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
private $_basisflag = 0;
|
|
154
|
+
private $_compress = 0;
|
|
155
|
+
private $_rpflag = 0;
|
|
156
|
+
private $_mhflag = 0;
|
|
157
|
+
private $_quiet = 0;
|
|
158
|
+
private $_statistics = 0;
|
|
159
|
+
private $_version = 0;
|
|
160
|
+
private $_size;
|
|
161
|
+
private $_parser_template = "";
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Process a flag command line argument.
|
|
165
|
+
*
|
|
166
|
+
* @param int $i
|
|
167
|
+
* @param array $argv
|
|
168
|
+
*
|
|
169
|
+
* @return int
|
|
170
|
+
*/
|
|
171
|
+
function handleflags($i, $argv)
|
|
172
|
+
{
|
|
173
|
+
if (!isset($argv[1]) || !isset(self::$_options[$argv[$i][1]])) {
|
|
174
|
+
throw new Exception('Command line syntax error: undefined option "' . $argv[$i] . '"');
|
|
175
|
+
}
|
|
176
|
+
$v = self::$_options[$argv[$i][1]] == '-';
|
|
177
|
+
if (self::$_options[$argv[$i][1]]['type'] == self::OPT_FLAG) {
|
|
178
|
+
$this->{self::$_options[$argv[$i][1]]['arg']} = 1;
|
|
179
|
+
} elseif (self::$_options[$argv[$i][1]]['type'] == self::OPT_FFLAG) {
|
|
180
|
+
$this->{self::$_options[$argv[$i][1]]['arg']}($v);
|
|
181
|
+
} elseif (self::$_options[$argv[$i][1]]['type'] == self::OPT_FSTR) {
|
|
182
|
+
$this->{self::$_options[$argv[$i][1]]['arg']}(substr($v, 2));
|
|
183
|
+
} else {
|
|
184
|
+
throw new Exception('Command line syntax error: missing argument on switch: "' . $argv[$i] . '"');
|
|
185
|
+
}
|
|
186
|
+
return 0;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Process a command line switch which has an argument.
|
|
191
|
+
*
|
|
192
|
+
* @param int $i
|
|
193
|
+
* @param array $argv
|
|
194
|
+
*
|
|
195
|
+
* @return int
|
|
196
|
+
*/
|
|
197
|
+
function handleswitch($i, $argv)
|
|
198
|
+
{
|
|
199
|
+
$lv = 0;
|
|
200
|
+
$dv = 0.0;
|
|
201
|
+
$sv = $end = $cp = '';
|
|
202
|
+
$j; // int
|
|
203
|
+
$errcnt = 0;
|
|
204
|
+
$cp = strstr($argv[$i], '=');
|
|
205
|
+
if (!$cp) {
|
|
206
|
+
throw new Exception('INTERNAL ERROR: handleswitch passed bad argument, no "=" in arg');
|
|
207
|
+
}
|
|
208
|
+
$argv[$i] = substr($argv[$i], 0, strlen($argv[$i]) - strlen($cp));
|
|
209
|
+
if (!isset(self::$_options[$argv[$i]])) {
|
|
210
|
+
throw new Exception('Command line syntax error: undefined option "' . $argv[$i] .
|
|
211
|
+
$cp . '"');
|
|
212
|
+
}
|
|
213
|
+
$cp = substr($cp, 1);
|
|
214
|
+
switch (self::$_options[$argv[$i]]['type']) {
|
|
215
|
+
case self::OPT_FLAG:
|
|
216
|
+
case self::OPT_FFLAG:
|
|
217
|
+
throw new Exception('Command line syntax error: option requires an argument "' .
|
|
218
|
+
$argv[$i] . '=' . $cp . '"');
|
|
219
|
+
case self::OPT_DBL:
|
|
220
|
+
case self::OPT_FDBL:
|
|
221
|
+
$dv = (double) $cp;
|
|
222
|
+
break;
|
|
223
|
+
case self::OPT_INT:
|
|
224
|
+
case self::OPT_FINT:
|
|
225
|
+
$lv = (int) $cp;
|
|
226
|
+
break;
|
|
227
|
+
case self::OPT_STR:
|
|
228
|
+
case self::OPT_FSTR:
|
|
229
|
+
$sv = $cp;
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
switch(self::$_options[$argv[$i]]['type']) {
|
|
233
|
+
case self::OPT_FLAG:
|
|
234
|
+
case self::OPT_FFLAG:
|
|
235
|
+
break;
|
|
236
|
+
case self::OPT_DBL:
|
|
237
|
+
$this->{self::$_options[$argv[$i]]['arg']} = $dv;
|
|
238
|
+
break;
|
|
239
|
+
case self::OPT_FDBL:
|
|
240
|
+
$this->{self::$_options[$argv[$i]]['arg']}($dv);
|
|
241
|
+
break;
|
|
242
|
+
case self::OPT_INT:
|
|
243
|
+
$this->{self::$_options[$argv[$i]]['arg']} = $lv;
|
|
244
|
+
break;
|
|
245
|
+
case self::OPT_FINT:
|
|
246
|
+
$this->{self::$_options[$argv[$i]]['arg']}($lv);
|
|
247
|
+
break;
|
|
248
|
+
case self::OPT_STR:
|
|
249
|
+
$this->{self::$_options[$argv[$i]]['arg']} = $sv;
|
|
250
|
+
break;
|
|
251
|
+
case self::OPT_FSTR:
|
|
252
|
+
$this->{self::$_options[$argv[$i]]['arg']}($sv);
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
return 0;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* OptInit
|
|
260
|
+
*
|
|
261
|
+
* @param array $a Arguments
|
|
262
|
+
*
|
|
263
|
+
* @return int
|
|
264
|
+
*/
|
|
265
|
+
function OptInit($a)
|
|
266
|
+
{
|
|
267
|
+
$errcnt = 0;
|
|
268
|
+
$argv = $a;
|
|
269
|
+
try {
|
|
270
|
+
if (is_array($argv) && count($argv) && self::$_options) {
|
|
271
|
+
for ($i = 1; $i < count($argv); $i++) {
|
|
272
|
+
if ($argv[$i][0] == '+' || $argv[$i][0] == '-') {
|
|
273
|
+
$errcnt += $this->handleflags($i, $argv);
|
|
274
|
+
} elseif (strstr($argv[$i], '=')) {
|
|
275
|
+
$errcnt += $this->handleswitch($i, $argv);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
} catch (Exception $e) {
|
|
280
|
+
$this->OptPrint();
|
|
281
|
+
echo $e->getMessage()."\n";
|
|
282
|
+
//exit(1);
|
|
283
|
+
}
|
|
284
|
+
return 0;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Return the index of the N-th non-switch argument. Return -1
|
|
289
|
+
* if N is out of range.
|
|
290
|
+
*
|
|
291
|
+
* @param int $n
|
|
292
|
+
* @param int $a
|
|
293
|
+
*
|
|
294
|
+
* @return int
|
|
295
|
+
*/
|
|
296
|
+
private function _argindex($n, $a)
|
|
297
|
+
{
|
|
298
|
+
$dashdash = 0;
|
|
299
|
+
if (!is_array($a) || !count($a)) {
|
|
300
|
+
return -1;
|
|
301
|
+
}
|
|
302
|
+
for ($i=1; $i < count($a); $i++) {
|
|
303
|
+
if ($dashdash || !($a[$i][0] == '-' || $a[$i][0] == '+' || strchr($a[$i], '='))) {
|
|
304
|
+
if ($n == 0) {
|
|
305
|
+
return $i;
|
|
306
|
+
}
|
|
307
|
+
$n--;
|
|
308
|
+
}
|
|
309
|
+
if ($_SERVER['argv'][$i] == '--') {
|
|
310
|
+
$dashdash = 1;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return -1;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Return the value of the non-option argument as indexed by $i
|
|
318
|
+
*
|
|
319
|
+
* @param int $i
|
|
320
|
+
* @param array $a the value of $argv
|
|
321
|
+
*
|
|
322
|
+
* @return 0|string
|
|
323
|
+
*/
|
|
324
|
+
private function _optArg($i, $a)
|
|
325
|
+
{
|
|
326
|
+
if (-1 == ($ind = $this->_argindex($i, $a))) {
|
|
327
|
+
return 0;
|
|
328
|
+
}
|
|
329
|
+
return $a[$ind];
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* @param array $a
|
|
334
|
+
*
|
|
335
|
+
* @return int number of arguments
|
|
336
|
+
*/
|
|
337
|
+
function OptNArgs($a)
|
|
338
|
+
{
|
|
339
|
+
$cnt = $dashdash = 0;
|
|
340
|
+
if (is_array($a) && count($a)) {
|
|
341
|
+
for ($i = 1; $i < count($a); $i++) {
|
|
342
|
+
if ($dashdash
|
|
343
|
+
|| !($a[$i][0] == '-' || $a[$i][0] == '+' || strchr($a[$i], '='))
|
|
344
|
+
) {
|
|
345
|
+
$cnt++;
|
|
346
|
+
}
|
|
347
|
+
if ($a[$i] == "--") {
|
|
348
|
+
$dashdash = 1;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return $cnt;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Print out command-line options
|
|
357
|
+
*
|
|
358
|
+
* @return void
|
|
359
|
+
*/
|
|
360
|
+
function OptPrint()
|
|
361
|
+
{
|
|
362
|
+
$max = 0;
|
|
363
|
+
foreach (self::$_options as $label => $info) {
|
|
364
|
+
$len = strlen($label) + 1;
|
|
365
|
+
switch ($info['type']) {
|
|
366
|
+
case self::OPT_FLAG:
|
|
367
|
+
case self::OPT_FFLAG:
|
|
368
|
+
break;
|
|
369
|
+
case self::OPT_INT:
|
|
370
|
+
case self::OPT_FINT:
|
|
371
|
+
$len += 9; /* length of "<integer>" */
|
|
372
|
+
break;
|
|
373
|
+
case self::OPT_DBL:
|
|
374
|
+
case self::OPT_FDBL:
|
|
375
|
+
$len += 6; /* length of "<real>" */
|
|
376
|
+
break;
|
|
377
|
+
case self::OPT_STR:
|
|
378
|
+
case self::OPT_FSTR:
|
|
379
|
+
$len += 8; /* length of "<string>" */
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
if ($len > $max) {
|
|
383
|
+
$max = $len;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
foreach (self::$_options as $label => $info) {
|
|
387
|
+
switch ($info['type']) {
|
|
388
|
+
case self::OPT_FLAG:
|
|
389
|
+
case self::OPT_FFLAG:
|
|
390
|
+
echo " -$label";
|
|
391
|
+
echo str_repeat(' ', $max - strlen($label));
|
|
392
|
+
echo " $info[message]\n";
|
|
393
|
+
break;
|
|
394
|
+
case self::OPT_INT:
|
|
395
|
+
case self::OPT_FINT:
|
|
396
|
+
echo " $label=<integer>" . str_repeat(' ', $max - strlen($label) - 9);
|
|
397
|
+
echo " $info[message]\n";
|
|
398
|
+
break;
|
|
399
|
+
case self::OPT_DBL:
|
|
400
|
+
case self::OPT_FDBL:
|
|
401
|
+
echo " $label=<real>" . str_repeat(' ', $max - strlen($label) - 6);
|
|
402
|
+
echo " $info[message]\n";
|
|
403
|
+
break;
|
|
404
|
+
case self::OPT_STR:
|
|
405
|
+
case self::OPT_FSTR:
|
|
406
|
+
echo " $label=<string>" . str_repeat(' ', $max - strlen($label) - 8);
|
|
407
|
+
echo " $info[message]\n";
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* This routine is called with the argument to each -D command-line option.
|
|
415
|
+
* Add the macro defined to the azDefine array.
|
|
416
|
+
*
|
|
417
|
+
* @param string $z
|
|
418
|
+
*
|
|
419
|
+
* @return void
|
|
420
|
+
*/
|
|
421
|
+
private function _handleDOption($z)
|
|
422
|
+
{
|
|
423
|
+
if ($a = strstr($z, '=')) {
|
|
424
|
+
$z = substr($a, 1); // strip first =
|
|
425
|
+
}
|
|
426
|
+
$this->azDefine[] = $z;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**************** From the file "main.c" ************************************/
|
|
430
|
+
/*
|
|
431
|
+
** Main program file for the LEMON parser generator.
|
|
432
|
+
*/
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* The main program. Parse the command line and do it...
|
|
437
|
+
*
|
|
438
|
+
* @return int Number of error and conflicts
|
|
439
|
+
*/
|
|
440
|
+
function main()
|
|
441
|
+
{
|
|
442
|
+
$lem = new PHP_ParserGenerator_Data;
|
|
443
|
+
|
|
444
|
+
$this->OptInit($_SERVER['argv']);
|
|
445
|
+
if ($this->_version) {
|
|
446
|
+
echo "Lemon version 1.0/PHP_ParserGenerator port version @package_version@\n";
|
|
447
|
+
//exit(0);
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
if ($this->OptNArgs($_SERVER['argv']) != 1) {
|
|
451
|
+
echo "Exactly one filename argument is required.\n";
|
|
452
|
+
//exit(1);
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
$lem->errorcnt = 0;
|
|
456
|
+
$lem->parser_template = $this->_parser_template;
|
|
457
|
+
|
|
458
|
+
/* Initialize the machine */
|
|
459
|
+
$lem->argv0 = $_SERVER['argv'][0];
|
|
460
|
+
$lem->filename = $this->_optArg(0, $_SERVER['argv']);
|
|
461
|
+
$a = pathinfo($lem->filename);
|
|
462
|
+
if (isset($a['extension'])) {
|
|
463
|
+
$ext = '.' . $a['extension'];
|
|
464
|
+
$lem->filenosuffix = substr($lem->filename, 0, strlen($lem->filename) - strlen($ext));
|
|
465
|
+
} else {
|
|
466
|
+
$lem->filenosuffix = $lem->filename;
|
|
467
|
+
}
|
|
468
|
+
$lem->basisflag = $this->_basisflag;
|
|
469
|
+
$lem->has_fallback = 0;
|
|
470
|
+
$lem->nconflict = 0;
|
|
471
|
+
$lem->name = $lem->include_code = $lem->include_classcode = $lem->arg = $lem->tokentype = $lem->start = 0;
|
|
472
|
+
$lem->vartype = 0;
|
|
473
|
+
$lem->stacksize = 0;
|
|
474
|
+
$lem->error = $lem->overflow = $lem->failure = $lem->accept = $lem->tokendest = $lem->tokenprefix = $lem->outname = $lem->extracode = 0;
|
|
475
|
+
$lem->vardest = 0;
|
|
476
|
+
$lem->tablesize = 0;
|
|
477
|
+
PHP_ParserGenerator_Symbol::Symbol_new("$");
|
|
478
|
+
$lem->errsym = PHP_ParserGenerator_Symbol::Symbol_new("error");
|
|
479
|
+
|
|
480
|
+
/* Parse the input file */
|
|
481
|
+
$parser = new PHP_ParserGenerator_Parser($this);
|
|
482
|
+
$parser->Parse($lem);
|
|
483
|
+
if ($lem->errorcnt) {
|
|
484
|
+
return;
|
|
485
|
+
// exit($lem->errorcnt);
|
|
486
|
+
}
|
|
487
|
+
if ($lem->rule === 0) {
|
|
488
|
+
printf("Empty grammar.\n");
|
|
489
|
+
return;
|
|
490
|
+
//exit(1);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/* Count and index the symbols of the grammar */
|
|
494
|
+
$lem->nsymbol = PHP_ParserGenerator_Symbol::Symbol_count();
|
|
495
|
+
PHP_ParserGenerator_Symbol::Symbol_new("{default}");
|
|
496
|
+
$lem->symbols = PHP_ParserGenerator_Symbol::Symbol_arrayof();
|
|
497
|
+
for ($i = 0; $i <= $lem->nsymbol; $i++) {
|
|
498
|
+
$lem->symbols[$i]->index = $i;
|
|
499
|
+
}
|
|
500
|
+
usort($lem->symbols, array('PHP_ParserGenerator_Symbol', 'sortSymbols'));
|
|
501
|
+
for ($i = 0; $i <= $lem->nsymbol; $i++) {
|
|
502
|
+
$lem->symbols[$i]->index = $i;
|
|
503
|
+
}
|
|
504
|
+
// find the first lower-case symbol
|
|
505
|
+
for ($i = 1; ord($lem->symbols[$i]->name[0]) <= ord('Z'); $i++);
|
|
506
|
+
$lem->nterminal = $i;
|
|
507
|
+
|
|
508
|
+
/* Generate a reprint of the grammar, if requested on the command line */
|
|
509
|
+
if ($this->_rpflag) {
|
|
510
|
+
$this->Reprint();
|
|
511
|
+
} else {
|
|
512
|
+
/* Initialize the size for all follow and first sets */
|
|
513
|
+
$this->SetSize($lem->nterminal);
|
|
514
|
+
|
|
515
|
+
/* Find the precedence for every production rule (that has one) */
|
|
516
|
+
$lem->FindRulePrecedences();
|
|
517
|
+
|
|
518
|
+
/* Compute the lambda-nonterminals and the first-sets for every
|
|
519
|
+
** nonterminal */
|
|
520
|
+
$lem->FindFirstSets();
|
|
521
|
+
|
|
522
|
+
/* Compute all LR(0) states. Also record follow-set propagation
|
|
523
|
+
** links so that the follow-set can be computed later */
|
|
524
|
+
$lem->nstate = 0;
|
|
525
|
+
$lem->FindStates();
|
|
526
|
+
$lem->sorted = PHP_ParserGenerator_State::State_arrayof();
|
|
527
|
+
|
|
528
|
+
/* Tie up loose ends on the propagation links */
|
|
529
|
+
$lem->FindLinks();
|
|
530
|
+
|
|
531
|
+
/* Compute the follow set of every reducible configuration */
|
|
532
|
+
$lem->FindFollowSets();
|
|
533
|
+
|
|
534
|
+
/* Compute the action tables */
|
|
535
|
+
$lem->FindActions();
|
|
536
|
+
|
|
537
|
+
/* Compress the action tables */
|
|
538
|
+
if ($this->_compress===0) {
|
|
539
|
+
$lem->CompressTables();
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/* Reorder and renumber the states so that states with fewer choices
|
|
543
|
+
** occur at the end. */
|
|
544
|
+
$lem->ResortStates();
|
|
545
|
+
|
|
546
|
+
/* Generate a report of the parser generated. (the "y.output" file) */
|
|
547
|
+
if (!$this->_quiet) {
|
|
548
|
+
$lem->ReportOutput();
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/* Generate the source code for the parser */
|
|
552
|
+
$lem->ReportTable($this->_mhflag);
|
|
553
|
+
|
|
554
|
+
/* Produce a header file for use by the scanner. (This step is
|
|
555
|
+
** omitted if the "-m" option is used because makeheaders will
|
|
556
|
+
** generate the file for us.) */
|
|
557
|
+
//if (!$this->_mhflag) {
|
|
558
|
+
// $this->ReportHeader();
|
|
559
|
+
//}
|
|
560
|
+
}
|
|
561
|
+
if ($this->_statistics) {
|
|
562
|
+
printf(
|
|
563
|
+
"Parser statistics: %d terminals, %d nonterminals, %d rules\n",
|
|
564
|
+
$lem->nterminal,
|
|
565
|
+
$lem->nsymbol - $lem->nterminal,
|
|
566
|
+
$lem->nrule
|
|
567
|
+
);
|
|
568
|
+
printf(
|
|
569
|
+
" %d states, %d parser table entries, %d conflicts\n",
|
|
570
|
+
$lem->nstate,
|
|
571
|
+
$lem->tablesize,
|
|
572
|
+
$lem->nconflict
|
|
573
|
+
);
|
|
574
|
+
}
|
|
575
|
+
if ($lem->nconflict) {
|
|
576
|
+
printf("%d parsing conflicts.\n", $lem->nconflict);
|
|
577
|
+
}
|
|
578
|
+
//exit($lem->errorcnt + $lem->nconflict);
|
|
579
|
+
echo $lem->errorcnt + $lem->nconflict;
|
|
580
|
+
return ($lem->errorcnt + $lem->nconflict);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/**
|
|
584
|
+
* SetSize
|
|
585
|
+
*
|
|
586
|
+
* @param int $n
|
|
587
|
+
*
|
|
588
|
+
* @access public
|
|
589
|
+
* @return void
|
|
590
|
+
*/
|
|
591
|
+
function SetSize($n)
|
|
592
|
+
{
|
|
593
|
+
$this->_size = $n + 1;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* Merge in a merge sort for a linked list
|
|
598
|
+
*
|
|
599
|
+
* Side effects:
|
|
600
|
+
* The "next" pointers for elements in the lists a and b are
|
|
601
|
+
* changed.
|
|
602
|
+
*
|
|
603
|
+
* @param mixed $a A sorted, null-terminated linked list. (May be null).
|
|
604
|
+
* @param mixed $b A sorted, null-terminated linked list. (May be null).
|
|
605
|
+
* @param function $cmp A pointer to the comparison function.
|
|
606
|
+
* @param integer $offset Offset in the structure to the "next" field.
|
|
607
|
+
*
|
|
608
|
+
* @return mixed A pointer to the head of a sorted list containing the
|
|
609
|
+
* elements of both a and b.
|
|
610
|
+
*/
|
|
611
|
+
static function merge($a, $b, $cmp, $offset)
|
|
612
|
+
{
|
|
613
|
+
if ($a === 0) {
|
|
614
|
+
$head = $b;
|
|
615
|
+
} elseif ($b === 0) {
|
|
616
|
+
$head = $a;
|
|
617
|
+
} else {
|
|
618
|
+
if (call_user_func($cmp, $a, $b) < 0) {
|
|
619
|
+
$ptr = $a;
|
|
620
|
+
$a = $a->$offset;
|
|
621
|
+
} else {
|
|
622
|
+
$ptr = $b;
|
|
623
|
+
$b = $b->$offset;
|
|
624
|
+
}
|
|
625
|
+
$head = $ptr;
|
|
626
|
+
while ($a && $b) {
|
|
627
|
+
if (call_user_func($cmp, $a, $b) < 0) {
|
|
628
|
+
$ptr->$offset = $a;
|
|
629
|
+
$ptr = $a;
|
|
630
|
+
$a = $a->$offset;
|
|
631
|
+
} else {
|
|
632
|
+
$ptr->$offset = $b;
|
|
633
|
+
$ptr = $b;
|
|
634
|
+
$b = $b->$offset;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
if ($a !== 0) {
|
|
638
|
+
$ptr->$offset = $a;
|
|
639
|
+
} else {
|
|
640
|
+
$ptr->$offset = $b;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
return $head;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
#define LISTSIZE 30
|
|
647
|
+
/**
|
|
648
|
+
* Side effects:
|
|
649
|
+
* The "next" pointers for elements in list are changed.
|
|
650
|
+
*
|
|
651
|
+
* @param mixed $list Pointer to a singly-linked list of structures.
|
|
652
|
+
* @param mixed $next Pointer to pointer to the second element of the list.
|
|
653
|
+
* @param function $cmp A comparison function.
|
|
654
|
+
*
|
|
655
|
+
* @return mixed A pointer to the head of a sorted list containing the
|
|
656
|
+
* elements orginally in list.
|
|
657
|
+
*/
|
|
658
|
+
static function msort($list, $next, $cmp)
|
|
659
|
+
{
|
|
660
|
+
if ($list === 0) {
|
|
661
|
+
return $list;
|
|
662
|
+
}
|
|
663
|
+
if ($list->$next === 0) {
|
|
664
|
+
return $list;
|
|
665
|
+
}
|
|
666
|
+
$set = array_fill(0, 30, 0);
|
|
667
|
+
while ($list) {
|
|
668
|
+
$ep = $list;
|
|
669
|
+
$list = $list->$next;
|
|
670
|
+
$ep->$next = 0;
|
|
671
|
+
for ($i = 0; $i < 29 && $set[$i] !== 0; $i++) {
|
|
672
|
+
$ep = self::merge($ep, $set[$i], $cmp, $next);
|
|
673
|
+
$set[$i] = 0;
|
|
674
|
+
}
|
|
675
|
+
$set[$i] = $ep;
|
|
676
|
+
}
|
|
677
|
+
$ep = 0;
|
|
678
|
+
for ($i = 0; $i < 30; $i++) {
|
|
679
|
+
if ($set[$i] !== 0) {
|
|
680
|
+
$ep = self::merge($ep, $set[$i], $cmp, $next);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
return $ep;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/* Find a good place to break "msg" so that its length is at least "min"
|
|
687
|
+
** but no more than "max". Make the point as close to max as possible.
|
|
688
|
+
*/
|
|
689
|
+
static function findbreak($msg, $min, $max)
|
|
690
|
+
{
|
|
691
|
+
if ($min >= strlen($msg)) {
|
|
692
|
+
return strlen($msg);
|
|
693
|
+
}
|
|
694
|
+
for ($i = $spot = $min; $i <= $max && $i < strlen($msg); $i++) {
|
|
695
|
+
$c = $msg[$i];
|
|
696
|
+
if ($c == '-' && $i < $max - 1) {
|
|
697
|
+
$spot = $i + 1;
|
|
698
|
+
}
|
|
699
|
+
if ($c == ' ') {
|
|
700
|
+
$spot = $i;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
return $spot;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
static function ErrorMsg($filename, $lineno, $format)
|
|
707
|
+
{
|
|
708
|
+
/* Prepare a prefix to be prepended to every output line */
|
|
709
|
+
if ($lineno > 0) {
|
|
710
|
+
$prefix = sprintf("%20s:%d: ", $filename, $lineno);
|
|
711
|
+
} else {
|
|
712
|
+
$prefix = sprintf("%20s: ", $filename);
|
|
713
|
+
}
|
|
714
|
+
$prefixsize = strlen($prefix);
|
|
715
|
+
$availablewidth = 79 - $prefixsize;
|
|
716
|
+
|
|
717
|
+
/* Generate the error message */
|
|
718
|
+
$ap = func_get_args();
|
|
719
|
+
array_shift($ap); // $filename
|
|
720
|
+
array_shift($ap); // $lineno
|
|
721
|
+
array_shift($ap); // $format
|
|
722
|
+
$errmsg = vsprintf($format, $ap);
|
|
723
|
+
$linewidth = strlen($errmsg);
|
|
724
|
+
/* Remove trailing "\n"s from the error message. */
|
|
725
|
+
while ($linewidth > 0
|
|
726
|
+
&& in_array($errmsg[$linewidth-1], array("\n", "\r"), true)
|
|
727
|
+
) {
|
|
728
|
+
--$linewidth;
|
|
729
|
+
$errmsg = substr($errmsg, 0, strlen($errmsg) - 1);
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
/* Print the error message */
|
|
733
|
+
$base = 0;
|
|
734
|
+
$errmsg = str_replace(
|
|
735
|
+
array("\r", "\n", "\t"),
|
|
736
|
+
array(' ', ' ', ' '),
|
|
737
|
+
$errmsg
|
|
738
|
+
);
|
|
739
|
+
while (strlen($errmsg)) {
|
|
740
|
+
$end = $restart = self::findbreak($errmsg, 0, $availablewidth);
|
|
741
|
+
if (strlen($errmsg) <= 79 && $end < strlen($errmsg) && $end <= 79) {
|
|
742
|
+
$end = $restart = strlen($errmsg);
|
|
743
|
+
}
|
|
744
|
+
while (isset($errmsg[$restart]) && $errmsg[$restart] == ' ') {
|
|
745
|
+
$restart++;
|
|
746
|
+
}
|
|
747
|
+
printf("%s%.${end}s\n", $prefix, $errmsg);
|
|
748
|
+
$errmsg = substr($errmsg, $restart);
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
/**
|
|
753
|
+
* Duplicate the input file without comments and without actions
|
|
754
|
+
* on rules
|
|
755
|
+
*
|
|
756
|
+
* @return void
|
|
757
|
+
*/
|
|
758
|
+
function Reprint()
|
|
759
|
+
{
|
|
760
|
+
printf("// Reprint of input file \"%s\".\n// Symbols:\n", $this->filename);
|
|
761
|
+
$maxlen = 10;
|
|
762
|
+
for ($i = 0; $i < $this->nsymbol; $i++) {
|
|
763
|
+
$sp = $this->symbols[$i];
|
|
764
|
+
$len = strlen($sp->name);
|
|
765
|
+
if ($len > $maxlen ) {
|
|
766
|
+
$maxlen = $len;
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
$ncolumns = 76 / ($maxlen + 5);
|
|
770
|
+
if ($ncolumns < 1) {
|
|
771
|
+
$ncolumns = 1;
|
|
772
|
+
}
|
|
773
|
+
$skip = ($this->nsymbol + $ncolumns - 1) / $ncolumns;
|
|
774
|
+
for ($i = 0; $i < $skip; $i++) {
|
|
775
|
+
print "//";
|
|
776
|
+
for ($j = $i; $j < $this->nsymbol; $j += $skip) {
|
|
777
|
+
$sp = $this->symbols[$j];
|
|
778
|
+
//assert( sp->index==j );
|
|
779
|
+
printf(" %3d %-${maxlen}.${maxlen}s", $j, $sp->name);
|
|
780
|
+
}
|
|
781
|
+
print "\n";
|
|
782
|
+
}
|
|
783
|
+
for ($rp = $this->rule; $rp; $rp = $rp->next) {
|
|
784
|
+
printf("%s", $rp->lhs->name);
|
|
785
|
+
/*if ($rp->lhsalias) {
|
|
786
|
+
printf("(%s)", $rp->lhsalias);
|
|
787
|
+
}*/
|
|
788
|
+
print " ::=";
|
|
789
|
+
for ($i = 0; $i < $rp->nrhs; $i++) {
|
|
790
|
+
$sp = $rp->rhs[$i];
|
|
791
|
+
printf(" %s", $sp->name);
|
|
792
|
+
if ($sp->type == PHP_ParserGenerator_Symbol::MULTITERMINAL) {
|
|
793
|
+
for ($j = 1; $j < $sp->nsubsym; $j++) {
|
|
794
|
+
printf("|%s", $sp->subsym[$j]->name);
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
/*if ($rp->rhsalias[$i]) {
|
|
798
|
+
printf("(%s)", $rp->rhsalias[$i]);
|
|
799
|
+
}*/
|
|
800
|
+
}
|
|
801
|
+
print ".";
|
|
802
|
+
if ($rp->precsym) {
|
|
803
|
+
printf(" [%s]", $rp->precsym->name);
|
|
804
|
+
}
|
|
805
|
+
/*if ($rp->code) {
|
|
806
|
+
print "\n " . $rp->code);
|
|
807
|
+
}*/
|
|
808
|
+
print "\n";
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
}
|