/[svn]/linuxsampler/trunk/src/network/lscp.y
ViewVC logotype

Diff of /linuxsampler/trunk/src/network/lscp.y

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2523 by schoenebeck, Sun Feb 23 19:10:36 2014 UTC revision 2525 by schoenebeck, Mon Feb 24 17:52:51 2014 UTC
# Line 180  void yyerror(void* x, const char* s) { Line 180  void yyerror(void* x, const char* s) {
180  %parse-param {void* yyparse_param}  %parse-param {void* yyparse_param}
181    
182  // After entering the yyparse() function, store references to the parser's  // After entering the yyparse() function, store references to the parser's
183  // state stack, so that we can create more helpful syntax error messages than  // symbol stack, so that we can create more helpful syntax error messages than
184  // Bison (2.x) could do.  // Bison (2.x) could do.
185  %initial-action {  %initial-action {
186      yyparse_param_t* p = (yyparse_param_t*) yyparse_param;      yyparse_param_t* p = (yyparse_param_t*) yyparse_param;
# Line 1348  inline static BisonSymbolInfo _symbolInf Line 1348  inline static BisonSymbolInfo _symbolInf
1348    
1349  #else // Bison 2.x or older ...  #else // Bison 2.x or older ...
1350    
1351    //TODO: The Bison 2.x code below can probably soon just be deleted. Most Bisonx 2.x versions should be able to compile successfully with the Bison 3.x code above as well (just requires the existence of table yystos[] in the auto generated lscpparser.cpp).
1352    
1353  /**  /**
1354   * Returns true if the given grammar @a rule is a terminal symbol (in *our*   * Returns true if the given grammar @a rule is a terminal symbol (in *our*
1355   * terms).   * terms).
# Line 1455  static bool yyValid(std::vector<YYTYPE_I Line 1457  static bool yyValid(std::vector<YYTYPE_I
1457   * precise parse position & state represented by @a stack, according to Bison's   * precise parse position & state represented by @a stack, according to Bison's
1458   * LALR(1) parser algorithm.   * LALR(1) parser algorithm.
1459   *   *
1460   * This function is given a Bison parser state stack, reflecting the parser's   * This function is given a Bison parser symbol stack, reflecting the parser's
1461   * entire state at a certain point, i.e. when a syntax error occured. This   * entire state at a certain point, i.e. when a syntax error occured. This
1462   * function will then walk ahead the potential parse tree starting from the   * function will then walk ahead the potential parse tree starting from the
1463   * current head of the given state stack. This function will call itself   * current head of the given symbol stack. This function will call itself
1464   * recursively to scan the individual parse tree branches. As soon as it hits   * recursively to scan the individual parse tree branches. As soon as it hits
1465   * on the next non-terminal grammar symbol in one parse tree branch, it adds the   * on the next non-terminal grammar symbol in one parse tree branch, it adds the
1466   * found non-terminal symbol to @a expectedSymbols and aborts scanning the   * found non-terminal symbol to @a expectedSymbols and aborts scanning the
1467   * respective tree branch further. If any local parser state is reached a second   * respective tree branch further. If any local parser state is reached a second
1468   * time, the respective parse tree is aborted to avoid any endless recursion.   * time, the respective parse tree is aborted to avoid any endless recursion.
1469   *   *
1470   * @param stack - current Bison (yacc) state stack to be examined   * @param stack - current Bison (yacc) symbol stack to be examined
1471   * @param expectedSymbols - will be filled with next expected grammar symbols   * @param expectedSymbols - will be filled with next expected grammar symbols
1472   * @param nextExpectedChars - just for internal purpose, due to the recursive   * @param nextExpectedChars - just for internal purpose, due to the recursive
1473   *                            implementation of this function, do supply an   *                            implementation of this function, do supply an
# Line 1480  static void walkAndFillExpectedSymbols( Line 1482  static void walkAndFillExpectedSymbols(
1482  #if DEBUG_BISON_SYNTAX_ERROR_WALKER  #if DEBUG_BISON_SYNTAX_ERROR_WALKER
1483      printf("\n");      printf("\n");
1484      for (int i = 0; i < depth; ++i) printf("\t");      for (int i = 0; i < depth; ++i) printf("\t");
1485      printf("State stack:");      printf("Symbol stack:");
1486      for (int i = 0; i < stack.size(); ++i) {      for (int i = 0; i < stack.size(); ++i) {
1487          printf(" %d", stack[i]);          printf(" %d", stack[i]);
1488      }      }
# Line 1512  static void walkAndFillExpectedSymbols( Line 1514  static void walkAndFillExpectedSymbols(
1514          for (int i = 0; i < depth; ++i) printf("\t");          for (int i = 0; i < depth; ++i) printf("\t");
1515          printf("(default reduction)\n");          printf("(default reduction)\n");
1516  #endif  #endif
1517            #if HAVE_BISON_MAJ >= 3
1518          if (!nextExpectedChars.empty() || !_isRuleTerminalSymbol(n, stack)) {          if (!nextExpectedChars.empty() || !_isRuleTerminalSymbol(n, stack)) {
1519            #else
1520            if (!nextExpectedChars.empty() || !_isRuleTerminalSymbol(n)) {
1521            #endif
1522              // Return the new resolved expected symbol (left-hand symbol of grammar              // Return the new resolved expected symbol (left-hand symbol of grammar
1523              // rule), then we're done in this state. (If the same symbol can be              // rule), then we're done in this state. (If the same symbol can be
1524              // matched on different ways, then it is non-terminal symbol.)              // matched on different ways, then it is non-terminal symbol.)
# Line 1619  static void walkAndFillExpectedSymbols( Line 1625  static void walkAndFillExpectedSymbols(
1625              continue; // duplicate state, ignore it to avoid endless recursions              continue; // duplicate state, ignore it to avoid endless recursions
1626          }          }
1627    
1628          // "shift" / push the new state on the state stack and call this          // "shift" / push the new state on the symbol stack and call this
1629          // function recursively, and restore the stack after the recurse return          // function recursively, and restore the stack after the recurse return
1630          stackSize = stack.size();          stackSize = stack.size();
1631          nextExpectedCharsLen = nextExpectedChars.size();          nextExpectedCharsLen = nextExpectedChars.size();
# Line 1682  static bool yyPushParse(std::vector<YYTY Line 1688  static bool yyPushParse(std::vector<YYTY
1688  #if DEBUG_PUSH_PARSE  #if DEBUG_PUSH_PARSE
1689      //printf("\n");      //printf("\n");
1690      //for (int i = 0; i < depth; ++i) printf("\t");      //for (int i = 0; i < depth; ++i) printf("\t");
1691      printf("State stack:");      printf("Symbol stack:");
1692      for (int i = 0; i < stack.size(); ++i) {      for (int i = 0; i < stack.size(); ++i) {
1693          printf(" %d", stack[i]);          printf(" %d", stack[i]);
1694      }      }
# Line 1759  static bool yyValid(std::vector<YYTYPE_I Line 1765  static bool yyValid(std::vector<YYTYPE_I
1765   * Returns the amount of correct characters of given @a line from the left,   * Returns the amount of correct characters of given @a line from the left,
1766   * according to the LSCP grammar.   * according to the LSCP grammar.
1767   *   *
1768   * @param stack - a Bison symbol state stack to work with   * @param stack - a Bison symbol stack to work with
1769   * @param line  - the input line to check   * @param line  - the input line to check
1770   * @param bAutoCorrect - if true: try to correct obvious, trivial syntax errors   * @param bAutoCorrect - if true: try to correct obvious, trivial syntax errors
1771   */   */
# Line 1767  static int yyValidCharacters(std::vector Line 1773  static int yyValidCharacters(std::vector
1773      int i;      int i;
1774      for (i = 0; i < line.size(); ++i) {      for (i = 0; i < line.size(); ++i) {
1775          // since we might check the same parser state twice against the current          // since we might check the same parser state twice against the current
1776          // char here below, and since the state stack might be altered          // char here below, and since the symbol stack might be altered
1777          // (i.e. shifted or reduced) on syntax errors, we have to backup the          // (i.e. shifted or reduced) on syntax errors, we have to backup the
1778          // current state stack and restore it on syntax errors below          // current symbol stack and restore it on syntax errors below
1779          std::vector<YYTYPE_INT16> stackCopy = stack;          std::vector<YYTYPE_INT16> stackCopy = stack;
1780          if (yyValid(stackCopy, line[i])) {          if (yyValid(stackCopy, line[i])) {
1781              stack = stackCopy;              stack = stackCopy;
# Line 1807  static std::set<String> yyExpectedSymbol Line 1813  static std::set<String> yyExpectedSymbol
1813      YYTYPE_INT16* ss = (*param->ppStackBottom);      YYTYPE_INT16* ss = (*param->ppStackBottom);
1814      YYTYPE_INT16* sp = (*param->ppStackTop);      YYTYPE_INT16* sp = (*param->ppStackTop);
1815      int iStackSize   = sp - ss + 1;      int iStackSize   = sp - ss + 1;
1816      // copy and wrap parser's state stack into a convenient STL container      // copy and wrap parser's symbol stack into a convenient STL container
1817      std::vector<YYTYPE_INT16> stack;      std::vector<YYTYPE_INT16> stack;
1818      for (int i = 0; i < iStackSize; ++i) {      for (int i = 0; i < iStackSize; ++i) {
1819          stack.push_back(ss[i]);          stack.push_back(ss[i]);
# Line 1826  static std::set<String> yyExpectedSymbol Line 1832  static std::set<String> yyExpectedSymbol
1832  #define DEBUG_YY_AUTO_COMPLETE 0  #define DEBUG_YY_AUTO_COMPLETE 0
1833    
1834  /**  /**
1835   * A set of parser state stacks. This type is used in yyAutoComplete() to keep   * A set of parser symbol stacks. This type is used in yyAutoComplete() to keep
1836   * track of all previous parser states, for detecting a parser state stack that   * track of all previous parser states, for detecting a parser symbol stack that
1837   * has already been before. Because if yyAutoComplete() reaches the exactly same   * has already been before. Because if yyAutoComplete() reaches the exactly same
1838   * parser state stack again, it means there is an endless recursion in that   * parser symbol stack again, it means there is an endless recursion in that
1839   * part of the grammar tree branch and shall not be evaluated any further,   * part of the grammar tree branch and shall not be evaluated any further,
1840   * because it would end up in an endless loop otherwise.   * because it would end up in an endless loop otherwise.
1841   *   *
# Line 1841  typedef std::set< std::vector<YYTYPE_INT Line 1847  typedef std::set< std::vector<YYTYPE_INT
1847    
1848  /**  /**
1849   * Generates and returns an auto completion string for the current parser   * Generates and returns an auto completion string for the current parser
1850   * state given by @a stack.   * state given by @a stack. That means, this function will return the longest
1851     * sequence of characters that is uniqueley expected to be sent next by the LSCP
1852     * client. Or in other words, if the LSCP client would send any other
1853     * character(s) than returned here, it would result in a syntax error.
1854     *
1855     * This function takes a Bison symbol @a stack as argument, reflecting the
1856     * current Bison parser state, and evaluates the individual grammar tree
1857     * branches starting from that particular position. It walks along the grammar
1858     * tree as long as there is only one possible tree branch and assembles a string
1859     * of input characters that would lead to that walk through the grammar tree. As
1860     * soon as a position in the grammar tree is reached where there are multiple
1861     * possible tree branches, this algorithm will stop, since the user could have
1862     * multiple possible valid characters he could type at that point, thus auto
1863     * completion would no longer be unique at that point.
1864   *   *
1865   * Regarding @a history argument: read the description on YYStackHistory for the   * Regarding @a history argument: read the description on YYStackHistory for the
1866   * purpose behind this argument.   * purpose behind this argument.
1867   *   *
1868   * @param stack - current Bison (yacc) state stack to create auto completion for   * @param stack - current Bison (yacc) symbol stack to create auto completion for
1869   * @param history - only for internal purpose, keeps a history of all previous parser state stacks   * @param history - only for internal purpose, keeps a history of all previous
1870     *                  parser symbol stacks (just for avoiding endless recursion in
1871     *                  this auto completion algorithm)
1872   * @param depth - just for internal debugging purposes   * @param depth - just for internal debugging purposes
1873   * @returns auto completion for current, given parser state   * @returns auto completion for current, given parser state
1874   */   */
# Line 1969  namespace LinuxSampler { Line 1990  namespace LinuxSampler {
1990  #define DEBUG_SHELL_INTERACTION 0  #define DEBUG_SHELL_INTERACTION 0
1991    
1992  /**  /**
1993   * If LSP shell mode is enabled for the respective LSCP client connection, then   * If LSCP shell mode is enabled for the respective LSCP client connection, then
1994   * this function is called on every new byte received from that client. It will   * this function is called on every new byte received from that client. It will
1995   * check the current total input line and reply to the LSCP shell for providing   * check the current total input line and reply to the LSCP shell with a
1996   * colored syntax highlighting and potential auto completion in the shell.   * specially crafted string, which allows the shell to provide colored syntax
1997     * highlighting and potential auto completion in the shell.
1998   *   *
1999   * It also performs auto correction of obvious & trivial syntax mistakes if   * It also performs auto correction of obvious & trivial syntax mistakes if
2000   * requested.   * requested.
2001   *   *
2002   * The return value of this function will be sent to the client. It contains one   * The return value of this function will be sent to the client. It contains one
2003   * line specially formatted for the LSCP shell, which can easily be processed by   * line specially formatted for the LSCP shell application, which can easily be
2004   * the client/shell for gettings its necessary informations like which part of   * processed by the client/shell for extracting its necessary informations like
2005   * the current command line is syntactically correct, which part is incorrect,   * which part of the current command line is syntactically correct, which part
2006   * what could be auto completed right now, etc.   * is incorrect, what could be auto completed right now, etc. So all the heavy
2007     * grammar evaluation tasks are peformed by the LSCP server for the LSCP shell
2008     * application (which is desgined as a thin client), so the LSCP shell
2009     * application will only have to show the results of the LSCP server's
2010     * evaluation to the user on the screen.
2011   *   *
2012   * @returns LSCP shell response line to be returned to the client   * @returns LSCP shell response line to be returned to the client
2013   */   */
# Line 2011  String lscpParserProcessShellInteraction Line 2037  String lscpParserProcessShellInteraction
2037    
2038      // get a clean parser stack to the last valid parse position      // get a clean parser stack to the last valid parse position
2039      // (due to the appended '\n' character above, and on syntax errors, the      // (due to the appended '\n' character above, and on syntax errors, the
2040      // state stack might be in undesired, i.e. reduced state)      // symbol stack might be in undesired, i.e. reduced state)
2041      stack.clear();      stack.clear();
2042      stack.push_back(0); // every Bison symbol stack starts with state zero      stack.push_back(0); // every Bison symbol stack starts with state zero
2043      l = line.substr(0, n);      l = line.substr(0, n);

Legend:
Removed from v.2523  
changed lines
  Added in v.2525

  ViewVC Help
Powered by ViewVC