I'm playing with Ply, my input file is as follows:

$foo = 1;
$bar = 3;

My problem is, when I pass multiple lines to the parser, it errors out
after the first statement at $bar...

<code>

#!/usr/bin/env python

import os, sys
import ply.lex as lex
import ply.yacc as yacc

tables = {}

reserved = {
            'if' : 'IF',
            'else' : 'ELSE',
            'elsif' : 'ELSIF',
            'while' : 'WHILE',
            'for' : 'FOR',
            'print' : 'PRINT'
}

tokens = [
          'VARIABLE', 'NUMBER',
          'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'EQUALS',
          'LPAREN', 'RPAREN', 'SEMI', 'COMMENT',
          'LT', 'GT', 'ET', 'LE', 'GE'
]
tokens += list(reserved.values())
t_LT = r'<'
t_GT = r'>'
t_ET = r'=='
t_LE = r'<='
t_GE = r'>='
t_SEMI = r';'
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_EQUALS = r'='
t_LPAREN = r'\('
t_RPAREN = r'\)'

t_ignore = ' \t'

def t_COMMENT(t):
    r'\#.*'
    pass

def t_VARIABLE(t):
    r'\$[a-zA-Z]{1,}'
    t.type = reserved.get(t.value, 'VARIABLE')
    return t

def t_NUMBER(t):
    r'[0-9]+'
    t.value = int(t.value)
    return t

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

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

lexer = lex.lex()

precedence = (
              ('left', 'PLUS','MINUS'),
              ('left', 'TIMES','DIVIDE')
            )

def p_statement_assignment(p):
    '''
    statement : VARIABLE EQUALS expression SEMI
    '''
    tables[p[1].replace("$", "")] = p[3]
    print "statement_assignment"

def p_statement_expression(p):
    '''
    statement : expression
    '''
    print "statement_expression"
    p[0] = p[1]

def p_expression(p):
    '''
    expression : expression PLUS expression
               | expression MINUS expression
               | expression TIMES expression
               | expression DIVIDE expression
    '''
    print "expression"
    if p[2] == '+':
        p[0] = p[1] + p[3]
    elif p[2] == '-':
        p[0] = p[1] - p[3]
    elif p[2] == '*':
        p[0] = p[1] * p[3]
    elif p[2] == '/':
        p[0] = p[1] / p[3]

def p_expression_number(p):
    '''
    expression : NUMBER
    '''
    print "expression_number"
    p[0] = p[1]

def p_expression_variable(p):
    '''
    expression : VARIABLE
    '''
    print "expression_variable"
    try:
        p[0] = tables[p[1].replace("$", "")]
    except IndexError:
        print "Cannot find variable"
        pass

def p_error(p):
    if not p:
        print "Syntax error: premature end of file"
    else:
        print "Syntax error on line %d: %s" % (p.lineno, p.value)

parser = yacc.yacc()

def run():
    data = open(sys.argv[1]).read()
    parser.parse(data)

if __name__ == "__main__":
    if len(sys.argv) != 2:
        sys.exit(0)

    run()
    print str(tables)

</code>

Does anyone see what I'm doing wrong here?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"ply-hack" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/ply-hack?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to