changes

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· 代码 · 共 738 行 · 第 1/2 页

TXT
738
字号
                                    # on the parsing stack.                   p[0] = some_val  # Sets the value of the 'foo' grammer symbol                                              This behavior makes it easier to work with embedded actions within the          parsing rules. For example, in C-yacc, it is possible to write code like          this:               bar:   A { printf("seen an A = %d\n", $1); } B { do_stuff; }          In this example, the printf() code executes immediately after A has been          parsed.  Within the embedded action code, $1 refers to the A symbol on          the stack.          To perform this equivalent action in PLY, you need to write a pair          of rules like this:               def p_bar(p):                     "bar : A seen_A B"                     do_stuff               def p_seen_A(p):                     "seen_A :"                     print "seen an A =", p[-1]          The second rule "seen_A" is merely a empty production which should be          reduced as soon as A is parsed in the "bar" rule above.  The use           of the negative index p[-1] is used to access whatever symbol appeared          before the seen_A symbol.          This feature also makes it possible to support inherited attributes.          For example:               def p_decl(p):                     "decl : scope name"               def p_scope(p):                     """scope : GLOBAL                              | LOCAL"""                   p[0] = p[1]               def p_name(p):                     "name : ID"                     if p[-1] == "GLOBAL":                          # ...                     else if p[-1] == "LOCAL":                          #...          In this case, the name rule is inheriting an attribute from the          scope declaration that precedes it.                 *** POTENTIAL INCOMPATIBILITY ***          If you are currently using negative indices within existing grammar rules,          your code will break.  This should be extremely rare if non-existent in          most cases.  The argument to various grammar rules is not usually not          processed in the same way as a list of items.          Version 2.0------------------------------09/07/06: beazley          Major cleanup and refactoring of the LR table generation code.  Both SLR          and LALR(1) table generation is now performed by the same code base with          only minor extensions for extra LALR(1) processing.09/07/06: beazley          Completely reimplemented the entire LALR(1) parsing engine to use the          DeRemer and Pennello algorithm for calculating lookahead sets.  This          significantly improves the performance of generating LALR(1) tables          and has the added feature of actually working correctly!  If you          experienced weird behavior with LALR(1) in prior releases, this should          hopefully resolve all of those problems.  Many thanks to           Andrew Waters and Markus Schoepflin for submitting bug reports          and helping me test out the revised LALR(1) support.Version 1.8------------------------------08/02/06: beazley          Fixed a problem related to the handling of default actions in LALR(1)          parsing.  If you experienced subtle and/or bizarre behavior when trying          to use the LALR(1) engine, this may correct those problems.  Patch          contributed by Russ Cox.  Note: This patch has been superceded by           revisions for LALR(1) parsing in Ply-2.0.08/02/06: beazley          Added support for slicing of productions in yacc.            Patch contributed by Patrick Mezard.Version 1.7------------------------------03/02/06: beazley          Fixed infinite recursion problem ReduceToTerminals() function that          would sometimes come up in LALR(1) table generation.  Reported by           Markus Schoepflin.03/01/06: beazley          Added "reflags" argument to lex().  For example:               lex.lex(reflags=re.UNICODE)          This can be used to specify optional flags to the re.compile() function          used inside the lexer.   This may be necessary for special situations such          as processing Unicode (e.g., if you want escapes like \w and \b to consult          the Unicode character property database).   The need for this suggested by          Andreas Jung.03/01/06: beazley          Fixed a bug with an uninitialized variable on repeated instantiations of parser          objects when the write_tables=0 argument was used.   Reported by Michael Brown.03/01/06: beazley          Modified lex.py to accept Unicode strings both as the regular expressions for          tokens and as input. Hopefully this is the only change needed for Unicode support.          Patch contributed by Johan Dahl.03/01/06: beazley          Modified the class-based interface to work with new-style or old-style classes.          Patch contributed by Michael Brown (although I tweaked it slightly so it would work          with older versions of Python).Version 1.6------------------------------05/27/05: beazley          Incorporated patch contributed by Christopher Stawarz to fix an extremely          devious bug in LALR(1) parser generation.   This patch should fix problems          numerous people reported with LALR parsing.05/27/05: beazley          Fixed problem with lex.py copy constructor.  Reported by Dave Aitel, Aaron Lav,          and Thad Austin. 05/27/05: beazley          Added outputdir option to yacc()  to control output directory. Contributed          by Christopher Stawarz.05/27/05: beazley          Added rununit.py test script to run tests using the Python unittest module.          Contributed by Miki Tebeka.Version 1.5------------------------------05/26/04: beazley          Major enhancement. LALR(1) parsing support is now working.          This feature was implemented by Elias Ioup (ezioup@alumni.uchicago.edu)          and optimized by David Beazley. To use LALR(1) parsing do          the following:               yacc.yacc(method="LALR")          Computing LALR(1) parsing tables takes about twice as long as          the default SLR method.  However, LALR(1) allows you to handle          more complex grammars.  For example, the ANSI C grammar          (in example/ansic) has 13 shift-reduce conflicts with SLR, but          only has 1 shift-reduce conflict with LALR(1).05/20/04: beazley          Added a __len__ method to parser production lists.  Can          be used in parser rules like this:             def p_somerule(p):                 """a : B C D                      | E F"                 if (len(p) == 3):                     # Must have been first rule                 elif (len(p) == 2):                     # Must be second rule          Suggested by Joshua Gerth and others.Version 1.4------------------------------04/23/04: beazley          Incorporated a variety of patches contributed by Eric Raymond.          These include:           0. Cleans up some comments so they don't wrap on an 80-column display.           1. Directs compiler errors to stderr where they belong.           2. Implements and documents automatic line counting when \n is ignored.           3. Changes the way progress messages are dumped when debugging is on.               The new format is both less verbose and conveys more information than              the old, including shift and reduce actions.04/23/04: beazley          Added a Python setup.py file to simply installation.  Contributed          by Adam Kerrison.04/23/04: beazley          Added patches contributed by Adam Kerrison.           -   Some output is now only shown when debugging is enabled.  This              means that PLY will be completely silent when not in debugging mode.                    -   An optional parameter "write_tables" can be passed to yacc() to              control whether or not parsing tables are written.   By default,              it is true, but it can be turned off if you don't want the yacc              table file. Note: disabling this will cause yacc() to regenerate              the parsing table each time.04/23/04: beazley          Added patches contributed by David McNab.  This patch addes two          features:          -   The parser can be supplied as a class instead of a module.              For an example of this, see the example/classcalc directory.          -   Debugging output can be directed to a filename of the user's              choice.  Use                 yacc(debugfile="somefile.out")          Version 1.3------------------------------12/10/02: jmdyck          Various minor adjustments to the code that Dave checked in today.          Updated test/yacc_{inf,unused}.exp to reflect today's changes.12/10/02: beazley          Incorporated a variety of minor bug fixes to empty production          handling and infinite recursion checking.  Contributed by          Michael Dyck.12/10/02: beazley          Removed bogus recover() method call in yacc.restart()Version 1.2------------------------------11/27/02: beazley          Lexer and parser objects are now available as an attribute          of tokens and slices respectively. For example:              def t_NUMBER(t):                 r'\d+'                 print t.lexer             def p_expr_plus(t):                 'expr: expr PLUS expr'                 print t.lexer                 print t.parser          This can be used for state management (if needed). 10/31/02: beazley          Modified yacc.py to work with Python optimize mode.  To make          this work, you need to use              yacc.yacc(optimize=1)          Furthermore, you need to first run Python in normal mode          to generate the necessary parsetab.py files.  After that,          you can use python -O or python -OO.            Note: optimized mode turns off a lot of error checking.          Only use when you are sure that your grammar is working.          Make sure parsetab.py is up to date!10/30/02: beazley          Added cloning of Lexer objects.   For example:              import copy              l = lex.lex()              lc = copy.copy(l)              l.input("Some text")              lc.input("Some other text")              ...          This might be useful if the same "lexer" is meant to          be used in different contexts---or if multiple lexers          are running concurrently.                10/30/02: beazley          Fixed subtle bug with first set computation and empty productions.          Patch submitted by Michael Dyck.10/30/02: beazley          Fixed error messages to use "filename:line: message" instead          of "filename:line. message".  This makes error reporting more          friendly to emacs. Patch submitted by Fran鏾is Pinard.10/30/02: beazley          Improvements to parser.out file.  Terminals and nonterminals          are sorted instead of being printed in random order.          Patch submitted by Fran鏾is Pinard.10/30/02: beazley          Improvements to parser.out file output.  Rules are now printed          in a way that's easier to understand.  Contributed by Russ Cox.10/30/02: beazley          Added 'nonassoc' associativity support.    This can be used          to disable the chaining of operators like a < b < c.          To use, simply specify 'nonassoc' in the precedence table          precedence = (            ('nonassoc', 'LESSTHAN', 'GREATERTHAN'),  # Nonassociative operators            ('left', 'PLUS', 'MINUS'),            ('left', 'TIMES', 'DIVIDE'),            ('right', 'UMINUS'),            # Unary minus operator          )          Patch contributed by Russ Cox.10/30/02: beazley          Modified the lexer to provide optional support for Python -O and -OO          modes.  To make this work, Python *first* needs to be run in          unoptimized mode.  This reads the lexing information and creates a          file "lextab.py".  Then, run lex like this:                   # module foo.py                   ...                   ...                   lex.lex(optimize=1)          Once the lextab file has been created, subsequent calls to          lex.lex() will read data from the lextab file instead of using           introspection.   In optimized mode (-O, -OO) everything should          work normally despite the loss of doc strings.          To change the name of the file 'lextab.py' use the following:                  lex.lex(lextab="footab")          (this creates a file footab.py)         Version 1.1   October 25, 2001------------------------------10/25/01: beazley          Modified the table generator to produce much more compact data.          This should greatly reduce the size of the parsetab.py[c] file.          Caveat: the tables still need to be constructed so a little more          work is done in parsetab on import. 10/25/01: beazley          There may be a possible bug in the cycle detector that reports errors          about infinite recursion.   I'm having a little trouble tracking it          down, but if you get this problem, you can disable the cycle          detector as follows:                 yacc.yacc(check_recursion = 0)10/25/01: beazley          Fixed a bug in lex.py that sometimes caused illegal characters to be          reported incorrectly.  Reported by Sverre J鴕gensen.7/8/01  : beazley          Added a reference to the underlying lexer object when tokens are handled by          functions.   The lexer is available as the 'lexer' attribute.   This          was added to provide better lexing support for languages such as Fortran          where certain types of tokens can't be conveniently expressed as regular           expressions (and where the tokenizing function may want to perform a           little backtracking).  Suggested by Pearu Peterson.6/20/01 : beazley          Modified yacc() function so that an optional starting symbol can be specified.          For example:                             yacc.yacc(start="statement")          Normally yacc always treats the first production rule as the starting symbol.          However, if you are debugging your grammar it may be useful to specify          an alternative starting symbol.  Idea suggested by Rich Salz.                      Version 1.0  June 18, 2001--------------------------Initial public offering

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?