使用PLY Pars将表达式转换为CNF形式

2024-05-29 03:42:59 发布

您现在位置:Python中文网/ 问答频道 /正文

将布尔表达式转换为合取范式和析取范式。在

布尔表达式中允许使用以下运算符:

/\ (conjunction),  \/ (disjunction), 
-> (implication), ~ (negation)

条件:这个实现必须使用PLY Python库。在

示例:

^{pr2}$

我尝试使用PLY python库来实现这一点。但是,我不知道如何才能实现这个问题陈述。在

我附加了我的代码,但这只能验证公式,其他什么都不能。在

有谁能帮我实现这一点吗?在

我尝试使用PLY python库来实现这一点。但是,我不知道如何才能实现这个问题陈述。在

我附加了我的代码,但这只能验证公式,其他什么都不能。在

有谁能帮我实现这一点吗?在

tokens = (    'Var',    'CONJ',    'DISJ',    'IMPL',    'NEG',   
'LPAREN',    'RPAREN', )

t_Var = r'[a-zA-Z_][a-zA-Z0-9_]*' t_CONJ   = r'/\\' t_DISJ   = r'\\/'
t_IMPL  = r'\->' t_NEG = r'\~' t_LPAREN  = r'\(' t_RPAREN  = r'\)'

def t_newline(t):
    r'\n+'
    t.lexer.lineno += len(t.value)

t_ignore  = ' \t'

def t_error(t):
    print("Illegal character: ",t.value[0])
    t.lexer.skip(1)

def p_Fm(p):
    """
    Fm : LPAREN Fm IMP Fm RPAREN
       | LPAREN Fm CONJ Fm RPAREN
       | LPAREN Fm DISJ Fm RPAREN
       | LPAREN NEG Fm RPAREN  
    """

def p_Var(p):
    """
    Fm : Var
    """
    p[0] = p[1]

def p_error(p):
    print("Syntax error in input!",p)

import ply.lex as lex import ply.yacc as yacc

lexer = lex.lex()
data = "((A->B)/\\(C/\\D))"
lexer.input(data)

while True:
    tok = lexer.token()
    if not tok: break
    print(tok)

parser = yacc.yacc()
parser.parse(data)
print(data)

Tags: datavardeferrorprintplylexerfm

热门问题