[英]Grammar construction in ply - recursion allowed?
也許以前有人問過這個問題,但是我真的不知道要搜索什么。 假設我想使用一些字符串來構建解析器。
我有一個字符串,例如a OR b
, b 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)")
來稱呼它,但無濟於事。
表達式中的括號很常見。 我將首先為您介紹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.