Синтаксическая ошибка синтаксического анализатора Python PLY - PullRequest
1 голос
/ 28 января 2012

Все,

Я пишу очень упрощенный парсер с 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только.

1 Ответ

2 голосов
/ 28 января 2012

Ваше правило верхнего уровня требует одного утверждения. p_trash соответствует первому «.» и возвращает оператор, и нет правила верхнего уровня, позволяющего его продолжить. Вы можете сделать что-то вроде:

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

Вы также можете сделать что-то вроде этого (и создать список утверждений):

def p_statements(p):
    '''statements | statement statements
                  | empty'''
...