簡體   English   中英

如何使用PLY(Python Lex-Yacc)丟棄語法文件中的非終端

[英]How to discard non-terminal in grammar file with PLY (Python Lex-Yacc)

我在使用PLY時遇到了問題。 我想通過PLY創建一個調用圖生成器。 在某些情況下,我需要丟棄語法文件中的一些令牌。 這是因為我需要在解析器丟棄它之前識別該令牌時執行某些操作,因此我不能在lexer文件中丟棄它。 例如,'IF'標記是我想要丟棄的標記。 所以我嘗試做一些事情在語法文件中丟棄它。 就像:

def p_if(p):
    'if : IF'
    print "if"
    parser.symstack.pop()

但事情並沒有像我想的那樣。 我打印symstack(它是解析器的屬性,解析器是yacc.py的LRParser實例),symstack列表只包含先前的令牌但不包含'if'。 所以我想知道在這種情況下如何丟棄令牌。 誰能幫助我? 非常感謝!

你剛才問過這個問題,但沒有任何評論或答案。 這是一個可能的解釋原因。

我正在查看http://www.dabeaz.com/ply/ply.html中的文檔。 那里沒有關於操縱parser.symstack的東西。 它似乎不是一個暴露的,有文檔記錄的界面。

即你把叉子插入烤面包機。

如果您搞亂其內部數據結構,或者它可能會破壞下一版本的解析器生成器等,那么解析器可能會感到困惑嗎? 此外,您沒有充分解釋您正在嘗試做什么。 丟棄非終結符號的目的是什么,這究竟是什么意思? 那些情況是什么,問題是什么? 也許問題可以解決,而不需要進入解析器對象。

此外,沒有記錄的全局解析器對象。 您必須已經定義了此解析器變量,例如“parser = yacc.yacc()”(在第7節:多個分析器和詞典中記錄)。 既然你在解析器規則本身中引用了這個變量,那么這看起來非常糟糕。 規則有一種正確的方式來引用解析器,這是通過它們接收的p參數:你想要p.parser。 (再次記錄在第7節)。

非常感謝!! 實際上,我找到了解決問題的方法。 你是對的,不應該操縱parser.symstack。 因為我的英語不好(我母語不是英語),所以我沒有清楚地解釋我的問題。但我仍然感謝你的建議。 以下是我的解決方案,我希望這將有助於其他人。

I.定義p_error(p)函數

def p_error(p):
tok = yacc.token() # Get the next token
yacc.errok()
return tok #Return the next token

II。 在您需要的函數中引發語法錯誤

def p_somerule(p):
' a : A '
raise SyntaxError

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM