2012-01-27 18 views
1

すべて、Python PLYパーサー構文エラー

私は非常に単純なパーサーをpython PLYと書いています。それはのほとんどはですが、多くの入力行については、構文エラーがyaccから出てきます。

tokens = ('VAR', 'NUMBER', 'CLOSE', 'JUNK') 

# Tokens 

t_VAR  = r'%[mM]\[' 
t_CLOSE = r'\]' 
t_JUNK = r'.' 

# Ignored characters 
t_ignore = " \t\r" 

def t_NUMBER(t): 
    r'\d+' 
    try: 
     t.value = int(t.value) 
    except ValueError: 
     print("Integer value too large %d", t.value) 
     t.value = 0 
    return t 

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

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

# Build the lexer 
import ply.lex as lex 
lex.lex() 

# Parsing rules 

def p_statement(p): 
    '''statement : field''' 
    try: 
     print p[1] 
    except IndexError: 
     pass 

def p_trash(p): 
    '''statement : JUNK''' 
    pass 

def p_field(p): 
    '''field : VAR NUMBER CLOSE''' 
    #print p[1], p[2], p[3] 
    p[0] = p[2] 

def p_error(p): 
    print("Syntax error at '%s'" % repr(p)) #p.value) 

import ply.yacc as yacc 
yacc.yacc() 

サンプルについて:yacc.parse('.set %m[702] $substr($currentlength,2,$currentpg)')出力として与えられる:ここで少し簡単試験のために修飾された字句解析および構文解析器コード、ある

Syntax error at 'LexToken(JUNK,'s',1,1)' 
Syntax error at 'LexToken(JUNK,'$',1,13)' 

は、それが必要出力702のみ。

答えて

2

あなたの最上位レベルのルールには、1つのステートメントが必要です。 p_trashは最初の '。'と一致します。ステートメントを返し、それを継続させる最上位レベルのルールはありません。あなたはまた、このような何かを(と文のリストを作成する)ことができ

def p_junk(p): 
    '''statement | JUNK statement''' 

:あなたのような何かができる

def p_statements(p): 
    '''statements | statement statements 
        | empty''' 
+0

ああ当たり前!私はそれが忘れてしまった単純なものだと分かっていました。 –