diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2012-05-08 13:21:52 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2012-05-08 13:24:48 +0200 |
commit | 6f3022a3d4fc469a5234f454e245239b908e19b0 (patch) | |
tree | 212a0c6c1c69b55905deb99fd34e3e867cee7af1 /qv4syntaxchecker.cpp | |
parent | 08c29dabd8686c044be2d92a8222c0ca0193f0ec (diff) |
Added a simple syntax checker.
Diffstat (limited to 'qv4syntaxchecker.cpp')
-rw-r--r-- | qv4syntaxchecker.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/qv4syntaxchecker.cpp b/qv4syntaxchecker.cpp new file mode 100644 index 0000000000..64247d6954 --- /dev/null +++ b/qv4syntaxchecker.cpp @@ -0,0 +1,79 @@ + +#include "qv4syntaxchecker_p.h" + +using namespace QQmlJS; + +SyntaxChecker::SyntaxChecker() + : Lexer(&m_engine) + , m_stateStack(128) +{ +} + +void QQmlJS::SyntaxChecker::clearText() +{ + m_code.clear(); + m_tokens.clear(); +} + +void SyntaxChecker::appendText(const QString &text) +{ + m_code += text; +} + +QString SyntaxChecker::text() const +{ + return m_code; +} + +bool SyntaxChecker::canEvaluate() +{ + int yyaction = 0; + int yytoken = -1; + int yytos = -1; + + setCode(m_code, 1); + + m_tokens.clear(); + m_tokens.append(T_FEED_JS_PROGRAM); + + do { + if (++yytos == m_stateStack.size()) + m_stateStack.resize(m_stateStack.size() * 2); + + m_stateStack[yytos] = yyaction; + +again: + if (yytoken == -1 && action_index[yyaction] != -TERMINAL_COUNT) { + if (m_tokens.isEmpty()) + yytoken = lex(); + else + yytoken = m_tokens.takeFirst(); + } + + yyaction = t_action(yyaction, yytoken); + if (yyaction > 0) { + if (yyaction == ACCEPT_STATE) { + --yytos; + return true; + } + yytoken = -1; + } else if (yyaction < 0) { + const int ruleno = -yyaction - 1; + yytos -= rhs[ruleno]; + yyaction = nt_action(m_stateStack[yytos], lhs[ruleno] - TERMINAL_COUNT); + } + } while (yyaction); + + const int errorState = m_stateStack[yytos]; + if (t_action(errorState, T_AUTOMATIC_SEMICOLON) && canInsertAutomaticSemicolon(yytoken)) { + yyaction = errorState; + m_tokens.prepend(yytoken); + yytoken = T_SEMICOLON; + goto again; + } + + if (yytoken != EOF_SYMBOL) + return true; + + return false; +} |