2014-11-19 4 views
0

Lex файлКак я могу создать определение грамматики правильно разобрать вход

import ply.lex as lex 

# List of token names. 
tokens = (
    "SYMBOL", 
    "COUNT" 
) 

t_SYMBOL = (r"Cl|Ca|Co|Os|C|H|O") 

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

def t_error(t): 
    raise TypeError("Unknown text '%s'" % (t.value,)) 

atomLexer = lex.lex() 

data1 = "CH3Cl" 
data = "OClOsOH3C" 

def testItOut(): 
    # Give the lexer some input 
    atomLexer.input(data1) 
    # Tokenize 
    tok = atomLexer.token() 
    while tok: 
     print (tok) 
     tok = atomLexer.token() 

файл Анализировать

import ply.yacc as yacc 

# Get the token map from the lexer. 
from atomLex import tokens 

def p_expression_symbol(p): 
    'molecule : SYMBOL' 
    p[0] = p[1] 


def p_error(p): 
    raise TypeError("unknown text at %r" % (p.value,)) 

atomParser = yacc.yacc() 


def testItOut(): 
    # Give the parser some input 
    s = input('Type a chemical name > ') 
    # Parse it 
    result = atomParser.parse(s) 
    print ('The atom is: ' + result) 

while(True): 
    testItOut() 

В настоящее время я хотел бы иметь возможность войти в CH3Cl, хотя в моем файле синтаксического анализа Я не совсем уверен, как создать эти определения грамматики, которые мне были даны,

chemical : chemical molecule 
chemical : molecule 
molecule : SYMBOL COUNT 
molecule : SYMBOL 

Что ж, uld определения грамматики для них должны быть в файле анализа? Спасибо.

ответ

0

Существует хороший набор документации СЛОЯ с примерами, которые могут быть использованы для ответа на этот вопрос: http://www.dabeaz.com/ply/ply.html

Раздел 6.2, в частности, полезно. Я предлагаю вам изменить этот код:

def p_expression_symbol(p): 
    'molecule : SYMBOL' 
    p[0] = p[1] 

Включить новые правила. Название p_expression_symbol также неуместно. Думаю, вы скопировали это из одного из примеров. У нас есть:

def p_chemical_forumal(p): 
    '''molecule : SYMBOL 
     chemical : chemical molecule 
     chemical : molecule 
     molecule : SYMBOL COUNT 
     molecule : SYMBOL''' 
     p[0] = p[1] 

В документации, которая может быть применена к вашему упражнению, имеются и другие полезные примеры.