簡體   English   中英

層中的語法構造-允許遞歸嗎?

[英]Grammar construction in ply - recursion allowed?

也許以前有人問過這個問題,但是我真的不知道要搜索什么。 假設我想使用一些字符串來構建解析器。

我有一個字符串,例如a OR bb OR C a OR (b AND c) 現在,嵌套的括號對我造成了麻煩,我不知道如何構造適當的p_*函數。 允許遞歸嗎? 如果是這樣,怎么辦?


到目前為止,這是我所擁有的:

 import ply.lex as lex import ply.yacc as yacc # List of token names. This is always required tokens = ( 'VARIABLE', 'OR', 'AND', 'PAR_OPEN', 'PAR_CLOSE', ) # Regular expression rules for simple tokens t_ignore = ' \\t' t_VARIABLE = r'\\b[az]+\\b' t_OR = r'\\bOR\\b' t_AND = r'\\bAND\\b' t_PAR_OPEN = r'\\(' t_PAR_CLOSE = r'\\)' def t_error(t): print("Illegal character '%s'" % t.value[0]) t.lexer.skip(1) # Build the lexer lexer = lex.lex() def p_term(p): '''term : VARIABLE OR VARIABLE | VARIABLE AND VARIABLE | PAR_OPEN VARIABLE AND VARIABLE PAR_CLOSE''' if p[2] == 'AND': p[0] = "".join([p[1], p[3]]) for idx, val in enumerate(p): print(idx, val) def p_error(p): print("Syntax error in input!") print(p) parser = yacc.yacc() res = parser.parse("(a AND b)") print(res) 

我也想用例如res = parser.parse("a OR (b AND c)")來稱呼它,但無濟於事。


PS:這確實是基於另一個人的問題

表達式中的括號很常見。 我將首先為您介紹PLY文檔的第5部分, 該文檔提供了一個嵌套表達式解析的示例。 是的,遞歸就是答案。

有幾個短語用來表示“表達式的最小元素”。 您可能會看到“ atom”或“ term”(“ terminal”的縮寫)或“ primary-expression”。

在處理帶括號的子表達式時,通常采用這種方法。 編寫一個語法規則,以統一各種低級內容(例如,文字數字和變量名稱),並在該點添加子表達式。

在此示例中,從PLY文檔來看, expression是最高級的東西,並支持加法和減法。 下一級是支持乘法和除法的term 最底層的是factor ,它不支持任何運算,但是將NUMBER和括號子表達式統一。 一個因子可以是7但也可以是(7 + 2 * 3)

 expression : expression + term
            | expression - term
            | term

 term       : term * factor
            | term / factor
            | factor

 factor     : NUMBER
            | ( expression )

暫無
暫無

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

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