PLY LEX 和 YACC 的问题
Problems with PLY LEX and YACC
我正在尝试 运行 PLY 简单示例的第一部分,但我遇到了一个奇怪的错误。当我 运行 下面的代码时,它给我一个关于 lex.lex() 的错误
有人知道问题出在哪里吗?
import ply.lex as lex
tokens = [ 'NAME','NUMBER','PLUS','MINUS','TIMES', 'DIVIDE', 'EQUALS' ]
t_ignore = '\t'
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_EQUALS = r'='
t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
def t_NUMBER(t):
r'\d+'
t.value = int(t.value)
return t
lex.lex() # Build the lexer
这是错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-e527bd224769> in <module>()
14 return t
15
---> 16 ply.lex.lex() # Build the lexer
c:\python27\lib\site-packages\ply\lex.pyc in lex(module, object, debug, optimize, lextab, reflags, nowarn, outputdir, debuglog, errorlog)
904 linfo.get_all()
905 if not optimize:
--> 906 if linfo.validate_all():
907 raise SyntaxError("Can't build lexer")
908
c:\python27\lib\site-packages\ply\lex.pyc in validate_all(self)
578 self.validate_tokens()
579 self.validate_literals()
--> 580 self.validate_rules()
581 return self.error
582
c:\python27\lib\site-packages\ply\lex.pyc in validate_rules(self)
820
821 for module in self.modules:
--> 822 self.validate_module(module)
823
824 # -----------------------------------------------------------------------------
c:\python27\lib\site-packages\ply\lex.pyc in validate_module(self, module)
831
832 def validate_module(self, module):
--> 833 lines, linen = inspect.getsourcelines(module)
834
835 fre = re.compile(r'\s*def\s+(t_[a-zA-Z_0-9]*)\(')
c:\python27\lib\inspect.pyc in getsourcelines(object)
688 original source file the first line of code was found. An IOError is
689 raised if the source code cannot be retrieved."""
--> 690 lines, lnum = findsource(object)
691
692 if ismodule(object): return lines, 0
c:\python27\lib\inspect.pyc in findsource(object)
524 is raised if the source code cannot be retrieved."""
525
--> 526 file = getfile(object)
527 sourcefile = getsourcefile(object)
528 if not sourcefile and file[:1] + file[-1:] != '<>':
c:\python27\lib\inspect.pyc in getfile(object)
401 if hasattr(object, '__file__'):
402 return object.__file__
--> 403 raise TypeError('{!r} is a built-in module'.format(object))
404 if isclass(object):
405 object = sys.modules.get(object.__module__)
TypeError: <module '__main__' (built-in)> is a built-in module
您正在尝试从某种 REPL(ipython
,猜测)运行 ply
。
无论出于何种原因,这都行不通。 Ply 坚持语法是一个模块,这意味着它必须在一个文件中。该错误准确地表明没有与语法源关联的文件。
事实证明,问题是我通过 iPython Notebook 运行ning 代码,但出于某种原因它不喜欢它。将代码保存为常规 .py 文件并通过命令提示符 运行 保存,没有发生任何错误!
P.S。如果有人能详细说明为什么代码在 iPython Notebook 环境中不 运行,我将不胜感激!
我正在尝试 运行 PLY 简单示例的第一部分,但我遇到了一个奇怪的错误。当我 运行 下面的代码时,它给我一个关于 lex.lex() 的错误 有人知道问题出在哪里吗?
import ply.lex as lex
tokens = [ 'NAME','NUMBER','PLUS','MINUS','TIMES', 'DIVIDE', 'EQUALS' ]
t_ignore = '\t'
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_EQUALS = r'='
t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
def t_NUMBER(t):
r'\d+'
t.value = int(t.value)
return t
lex.lex() # Build the lexer
这是错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-e527bd224769> in <module>()
14 return t
15
---> 16 ply.lex.lex() # Build the lexer
c:\python27\lib\site-packages\ply\lex.pyc in lex(module, object, debug, optimize, lextab, reflags, nowarn, outputdir, debuglog, errorlog)
904 linfo.get_all()
905 if not optimize:
--> 906 if linfo.validate_all():
907 raise SyntaxError("Can't build lexer")
908
c:\python27\lib\site-packages\ply\lex.pyc in validate_all(self)
578 self.validate_tokens()
579 self.validate_literals()
--> 580 self.validate_rules()
581 return self.error
582
c:\python27\lib\site-packages\ply\lex.pyc in validate_rules(self)
820
821 for module in self.modules:
--> 822 self.validate_module(module)
823
824 # -----------------------------------------------------------------------------
c:\python27\lib\site-packages\ply\lex.pyc in validate_module(self, module)
831
832 def validate_module(self, module):
--> 833 lines, linen = inspect.getsourcelines(module)
834
835 fre = re.compile(r'\s*def\s+(t_[a-zA-Z_0-9]*)\(')
c:\python27\lib\inspect.pyc in getsourcelines(object)
688 original source file the first line of code was found. An IOError is
689 raised if the source code cannot be retrieved."""
--> 690 lines, lnum = findsource(object)
691
692 if ismodule(object): return lines, 0
c:\python27\lib\inspect.pyc in findsource(object)
524 is raised if the source code cannot be retrieved."""
525
--> 526 file = getfile(object)
527 sourcefile = getsourcefile(object)
528 if not sourcefile and file[:1] + file[-1:] != '<>':
c:\python27\lib\inspect.pyc in getfile(object)
401 if hasattr(object, '__file__'):
402 return object.__file__
--> 403 raise TypeError('{!r} is a built-in module'.format(object))
404 if isclass(object):
405 object = sys.modules.get(object.__module__)
TypeError: <module '__main__' (built-in)> is a built-in module
您正在尝试从某种 REPL(ipython
,猜测)运行 ply
。
无论出于何种原因,这都行不通。 Ply 坚持语法是一个模块,这意味着它必须在一个文件中。该错误准确地表明没有与语法源关联的文件。
事实证明,问题是我通过 iPython Notebook 运行ning 代码,但出于某种原因它不喜欢它。将代码保存为常规 .py 文件并通过命令提示符 运行 保存,没有发生任何错误!
P.S。如果有人能详细说明为什么代码在 iPython Notebook 环境中不 运行,我将不胜感激!