From adcd259268cd1b252a469cc3cca25d737d849583 Mon Sep 17 00:00:00 2001 From: Yuji Hirose Date: Fri, 27 Nov 2015 13:36:27 -0500 Subject: [PATCH] Changed to show AST results. --- lint/online/main.cc | 41 +++++++++++++++++++++++++++---- lint/online/playground.vcxproj | 1 + lint/online/www/index.html | 45 ++++++++++++++++++++++++++-------- 3 files changed, 72 insertions(+), 15 deletions(-) diff --git a/lint/online/main.cc b/lint/online/main.cc index 96365ce..f39e617 100644 --- a/lint/online/main.cc +++ b/lint/online/main.cc @@ -33,15 +33,39 @@ bool parse_grammar(const string& text, peg::parser& peg, string& json) return ret; } -bool parse_code(const string& text, peg::parser& peg, string& json) +bool parse_code(const string& text, peg::parser& peg, string& json, shared_ptr& ast) { + peg.enable_ast(); peg.log = makeJSONFormatter(json); json += "["; - auto ret = peg.parse_n(text.data(), text.size()); + auto ret = peg.parse_n(text.data(), text.size(), ast); json += "]"; return ret; } +template +void dump_ast(const shared_ptr& ptr, string& json, int level = 0) +{ + const auto& ast = *ptr; + for (auto i = 0; i < level; i++) { + json += " "; + } + string name; + if (ast.name == ast.original_name) { + name = ast.name; + } else { + name = ast.original_name + " (" + ast.name + ")"; + } + if (ast.is_token) { + json += "- " + name + "(" + ast.token + ")\\n"; + } else { + json += "+ " + name +"\\n"; + } + for (auto node : ast.nodes) { + dump_ast(node, json, level + 1); + } +} + int main(void) { Server svr; @@ -56,21 +80,28 @@ int main(void) string grammarResult; string codeResult; + string astResult; + string astResultOptimized; peg::parser peg; auto ret = parse_grammar(grammarText, peg, grammarResult); if (ret && peg) { const auto& codeText = req.params.at("code"); - parse_code(codeText, peg, codeResult); + shared_ptr ast; + if (parse_code(codeText, peg, codeResult, ast)) { + dump_ast(ast, astResult); + dump_ast(peg::AstOptimizer(true).optimize(ast), astResultOptimized); + } } string json; json += "{"; json += "\"grammar\":" + grammarResult; if (!codeResult.empty()) { - json += +","; - json += "\"code\":" + codeResult; + json += ",\"code\":" + codeResult; + json += ",\"ast\":\"" + astResult + "\""; + json += ",\"astOptimized\":\"" + astResultOptimized + "\""; } json += "}"; diff --git a/lint/online/playground.vcxproj b/lint/online/playground.vcxproj index 653d50d..294edba 100644 --- a/lint/online/playground.vcxproj +++ b/lint/online/playground.vcxproj @@ -14,6 +14,7 @@ + diff --git a/lint/online/www/index.html b/lint/online/www/index.html index 14f63fc..f01b6ea 100644 --- a/lint/online/www/index.html +++ b/lint/online/www/index.html @@ -89,13 +89,13 @@ body {
  • Valid
  • -EXPRESSION       <-  _ TERM (TERM_OPERATOR TERM)*
    +EXPRESSION       <-  TERM (TERM_OPERATOR TERM)*
     TERM             <-  FACTOR (FACTOR_OPERATOR FACTOR)*
    -FACTOR           <-  NUMBER / '(' _ EXPRESSION ')' _
    -TERM_OPERATOR    <-  < [-+] > _
    -FACTOR_OPERATOR  <-  < [/*] > _
    -NUMBER           <-  < [0-9]+ > _
    -~_               <-  [ \t\r\n]*
    +FACTOR <- NUMBER / '(' EXPRESSION ')' +TERM_OPERATOR <- [-+] +FACTOR_OPERATOR <- [/*] +NUMBER <- [0-9]+ +%whitespace <- [ \t\r\n]*
    @@ -103,7 +103,9 @@ NUMBER <- < [0-9]+ > _
  • Code:
  • Valid
  • -
    2 * (3 + 4)
    +
    2 * (3 + 4)
    +
    
    +        
    
             
    @@ -118,6 +120,24 @@ NUMBER <- < [0-9]+ > _ var code = ace.edit("code-editor"); code.setShowPrintMargin(false); + var codeAst = ace.edit("code-ast"); + codeAst.setShowPrintMargin(false); + codeAst.setOptions({ + readOnly: true, + highlightActiveLine: false, + highlightGutterLine: false + }) + codeAst.renderer.$cursorLayer.element.style.opacity=0; + + var codeAstOptimized = ace.edit("code-ast-optimized"); + codeAstOptimized.setShowPrintMargin(false); + codeAstOptimized.setOptions({ + readOnly: true, + highlightActiveLine: false, + highlightGutterLine: false + }) + codeAstOptimized.renderer.$cursorLayer.element.style.opacity=0; + var generateErrorListHTML = function (errors) { var html = '
      '; @@ -148,15 +168,20 @@ NUMBER <- < [0-9]+ > _ $grammarInfo.html(''); $grammarValidation.removeClass('editor-validation-invalid').text('Valid'); - var isValid = data.code.length === 0; + codeAst.setValue(''); + codeAstOptimized.setValue(''); + + var isValid = data.code.length === 0; if (isValid) { $codeInfo.html(''); $codeValidation.removeClass('editor-validation-invalid').text('Valid'); - } else { + codeAst.insert(data.ast); + codeAstOptimized.insert(data.astOptimized); + } else { var html = generateErrorListHTML(data.code); $codeInfo.html(html); $codeValidation.addClass('editor-validation-invalid').text('Invalid'); - } + } $codeValidation.show(); } else { var html = generateErrorListHTML(data.grammar);