PLY Lex和Yacc问题

冰变量

我在使用PLY时遇到问题。我一直在阅读文档,并决定尝试这些示例。词汇处理示例工作得很好,但是解析我无法上班。我也看着这些文档,不理解如何将lex和yacc连接在一起以创建合适的编译器。解析器仅包含词法分析器的可能标记,据我所知,其他任何内容都没有。

我添加了一些内容,例如颜色(Colorama模块)和稍有不同的消息,但除此之外,该示例与示例相同:

#!/usr/bin/env python

### LEXICAL ANALYSIS ###


import ply.lex as lex

import colorama
colorama.init()

tokens = (
    "NUMBER",
    "PLUS",
    "MINUS",
    "MULTIPLY",
    "DIVIDE",
    "LBRACKET",
    "RBRACKET"
)


t_PLUS = r"\+"
t_MINUS = r"-"
t_MULTIPLY = r"\*"
t_DIVIDE = r"/"
t_LBRACKET = r"\("
t_RBRACKET = r"\)"

t_ignore = "\t\r "

def t_NUMBER(t):
    r"\d+"
    t.value = int(t.value)
    return t

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

def t_COMMENT(t):
    r"\#.*"
    print "Comment:", t.value

def t_error(t):
    print colorama.Fore.RED + "\n\nLEXICAL ERROR: line", t.lexer.lineno, "and position", t.lexer.lexpos, "invalid token:", t.value.split("\n")[0] + colorama.Fore.RESET
    t.lexer.skip(len(t.value))


def mylex(inp):
    lexer = lex.lex()

    lexer.input(inp)


    for token in lexer:
        print "Token:", token

那很好,但是解析器却不能:

#!/usr/bin/env python


import ply.yacc as yacc

from langlex 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 MULTIPLY 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 : LBRACKET expression RBRACKET"
    p[0] = p[2]

def p_error(p):
    print "Syntax error!"

parser = yacc.yacc()

while True:
    s = raw_input("calc > ")
    if not(s):
        continue
    result = parser.parse(s)
    print result

尝试运行它时出现以下错误:

calc > 5 + 10
Traceback (most recent call last):
  File "C:\Users\Max\Desktop\lang\langyacc.py", line 49, in <module>
    result = parser.parse(s)
  File "C:\Python27\lib\site-packages\ply\yacc.py", line 265, in parse
    return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc)
  File "C:\Python27\lib\site-packages\ply\yacc.py", line 881, in parseopt_notrack
    lexer = lex.lexer
AttributeError: 'module' object has no attribute 'lexer'

我通常是lex,yacc和编译器开发的初学者,不知道为什么会这样。任何帮助,将不胜感激。

杰夫·梅卡多(Jeff Mercado)

您尚未在词法分析器文件中构建词法分析器。您在函数中具有它,mylex()但实际上并没有构建它。

将其拉出功能。

lexer = lex.lex()

def mylex(inp):
    lexer.input(inp)
    # etc.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PLY LEX和YACC的问题

来自分类Dev

PLY Lex and Yacc Issues

来自分类Dev

输入末尾的Python Lex-Yacc(PLY)错误恢复

来自分类Dev

输入结尾处的Python Lex-Yacc(PLY)错误恢复

来自分类Dev

Python PLY Yacc-解析复数除法

来自分类Dev

使用PLY Yacc解析组树

来自分类Dev

yacc 和 lex 中的 yytext 累积问题

来自分类Dev

PLY YACC pythonic语法,用于累积逗号分隔值列表

来自分类Dev

使用PLY读取YACC文件(file.y)

来自分类Dev

多次出现解析项YACC-PLY导致的无限递归

来自分类Dev

Yacc / lex结尾太早,EOF /语法问题

来自分类Dev

.ply(多边形)格式文件在iOS 14中的问题

来自分类Dev

使用lex和yacc打印令牌

来自分类Dev

Lex和Yacc做编译器?

来自分类Dev

使用python和Ply解析器生成器时出错

来自分类Dev

使用不同的默认应用程序打开 .txt 和 .ply 文件

来自分类Dev

加快PLY文件读取

来自分类Dev

用PLY解析令牌

来自分类Dev

用PLY解析令牌

来自分类Dev

PLY区分语法

来自分类Dev

Angular 2 - 三个 JS - ply 文件在 Firefox 和 Safari 上工作但在 Chrome 中崩溃

来自分类Dev

使用Yacc和Lex进行词法和语法分析

来自分类Dev

Lex 和 Yacc/Flex 和 bison 语法错误

来自分类Dev

Lex和Yacc可以进行语法分析吗?

来自分类Dev

从lex和yacc语法生成编译器

来自分类Dev

YaCC和Lex编译C文件时出错

来自分类Dev

如何给lex和yacc中的文字赋予索引值?

来自分类Dev

Lex和Yacc可以进行语法分析吗?

来自分类Dev

lex 和 yacc 警告并且没有按预期工作