<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                假設你希望實現上面的簡單算術表達式的語法分析,代碼如下: ~~~ # Yacc example import ply.yacc as yacc # Get the token map from the lexer. This is required. from calclex import tokens def p_expression_plus(p): 'expression : expression PLUS term' p[0] = p[1] + p[3] def p_expression_minus(p): 'expression : expression MINUS term' p[0] = p[1] - p[3] def p_expression_term(p): 'expression : term' p[0] = p[1] def p_term_times(p): 'term : term TIMES factor' p[0] = p[1] * p[3] def p_term_div(p): 'term : term DIVIDE factor' p[0] = p[1] / p[3] def p_term_factor(p): 'term : factor' p[0] = p[1] def p_factor_num(p): 'factor : NUMBER' p[0] = p[1] def p_factor_expr(p): 'factor : LPAREN expression RPAREN' p[0] = p[2] # Error rule for syntax errors def p_error(p): print "Syntax error in input!" # Build the parser parser = yacc.yacc() while True: try: s = raw_input('calc > ') except EOFError: break if not s: continue result = parser.parse(s) print result ~~~ 在這個例子中,每個語法規則被定義成一個Python的方法,方法的文檔字符串描述了相應的上下文無關文法,方法的語句實現了對應規則的語義行為。每個方法接受一個單獨的p參數,p是一個包含有當前匹配語法的符號的序列,p[i]與語法符號的對應關系如下: ~~~ def p_expression_plus(p): 'expression : expression PLUS term' # ^ ^ ^ ^ # p[0] p[1] p[2] p[3] p[0] = p[1] + p[3] ~~~ 其中,p[i]的值相當于詞法分析模塊中對p.value屬性賦的值,對于非終結符的值,將在歸約時由p[0]的賦值決定,這里的值可以是任何類型,當然,大多數情況下只是Python的簡單類型、元組或者類的實例。在這個例子中,我們依賴這樣一個事實:NUMBER標記的值保存的是整型值,所有規則的行為都是得到這些整型值的算術運算結果,并傳遞結果。 > 注意:在這里負數的下標有特殊意義–這里的p[-1]不等同于p[3]。詳見下面的嵌入式動作部分 在yacc中定義的第一個語法規則被默認為起始規則(這個例子中的第一個出現的expression規則)。一旦起始規則被分析器歸約,而且再無其他輸入,分析器終止,最后的值將返回(這個值將是起始規則的p[0])。注意:也可以通過在yacc()中使用start關鍵字參數來指定起始規則 p_error(p)規則用于捕獲語法錯誤。詳見處理語法錯誤部分 為了構建分析器,需要調用yacc.yacc()方法。這個方法查看整個當前模塊,然后試圖根據你提供的文法構建LR分析表。第一次執行yacc.yacc(),你會得到如下輸出: ~~~ $ python calcparse.py Generating LALR tables calc > ~~~ 由于分析表的得出相對開銷較大(尤其包含大量的語法的情況下),分析表被寫入當前目錄的一個叫parsetab.py的文件中。除此之外,會生成一個調試文件parser.out。在接下來的執行中,yacc直到發現文法發生變化,才會重新生成分析表和parsetab.py文件,否則yacc會從parsetab.py中加載分析表。注:如果有必要的話這里輸出的文件名是可以改的。 如果在你的文法中有任何錯誤的話,yacc.py會產生調試信息,而且可能拋出異常。一些可以被檢測到的錯誤如下: * 方法重復定義(在語法文件中具有相同名字的方法) * 二義文法產生的移進-歸約和歸約-歸約沖突 * 指定了錯誤的文法 * 不可終止的遞歸(規則永遠無法終結) * 未使用的規則或標記 * 未定義的規則或標記 下面幾個部分將更詳細的討論語法規則 這個例子的最后部分展示了如何執行由yacc()方法創建的分析器。你只需要簡單的調用parse(),并將輸入字符串作為參數就能運行分析器。它將運行所有的語法規則,并返回整個分析的結果,這個結果就是在起始規則中賦給p[0]的值。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看