2016-01-11 4 views
0

Передача следующего файла точек в качестве входных данных в dot2tex приводит к исключению синтаксического анализа. Если я удалю «, 2», ошибка исчезнет.ParseException из PyParsing через dot2tex

digraph G { 
    node [shape="circle"]; 
    1,2 [style="filled"]; 
    1 -> { 2; 3; 4 } 
    2 -> { 5; 6 } 
    4 -> { 7; 8 } 
    5 -> { 9; 10 } 
    7 -> { 11; 12 } 
    } 

Я видел, как он работал в прошлом под Ubuntu. В настоящее время я использую cygwin64, с Python 2.7.10 и dot2tex 2.9.0. Я не эксперт Python, но кажется, что установка dot2tex из источника, используя python setup.py install, также установила версию PyParsing. После запуска dot2tex с переключателем --debug, кажется, из dot2tex.log, что теперь у меня есть версия 2.0.7 от Pyparsing:

File "/usr/lib/python2.7/site-packages/pyparsing-2.0.7-py2.7.egg/pyparsing.py", line 1129, in parseString 
    raise exc 
ParseException: Expected "}" (at char 46), (line:3, col:6) 

Где проблема приходит?

ответ

1

Я предполагаю, что грамматика Pyparsing в dot2tex не поддерживает эту форму:

1,2 [style="filled"]; 

бы эту работу?

1 [style="filled"]; 
2 [style="filled"]; 

EDIT:

Вы можете попробовать этот конвертер на вашем авто сгенерированных .dot файл перед его подачей в dot2tex:

from pyparsing import * 

sample = """\ 
    digraph G { 
    node [shape="circle"]; 
    1,2 [style="filled"]; 
    3,4 [size = 27.1]; 
    1 -> { 2; 3; 4 } 
    2 -> { 5; 6 } 
    4 -> { 7; 8 } 
    5 -> { 9; 10 } 
    7 -> { 11; 12 } 
    }""" 

# just guessing on these, they are probably close 
node_id = Word(alphanums+"_") 
attr_id = Word(alphas, alphanums+"_") 
attr_val = quotedString | pyparsing_common.fnumber 
attr_spec = attr_id + '=' + attr_val 

multiple_node_attr = (Group(delimitedList(node_id))("nodes") 
         + originalTextFor("[" + delimitedList(attr_spec) + "]" + ";")("attrs")) 
# ignore definitions that have only one node, no need to mess with them 
multiple_node_attr.addCondition(lambda t: len(t.nodes) > 1) 

# define parse-time callback to expand node lists to separate node definitions 
def expand_multiple_node_specs(s,l,tokens): 
    indent = (col(l,s)-1)*" " 
    join_str = '\n' + indent 
    return join_str.join("{} {}".format(nd, tokens.attrs) for nd in tokens.nodes) 
multiple_node_attr.addParseAction(expand_multiple_node_specs) 

# use transformString to apply changes in parse actions 
modified = multiple_node_attr.transformString(sample) 
print(modified) 

печатает:

digraph G { 
    node [shape="circle"]; 
    1 [style="filled"]; 
    2 [style="filled"]; 
    3 [size = 27.1]; 
    4 [size = 27.1]; 
    1 -> { 2; 3; 4 } 
    2 -> { 5; 6 } 
    4 -> { 7; 8 } 
    5 -> { 9; 10 } 
    7 -> { 11; 12 } 
    } 
+0

Спасибо, да , Увы, файл dot автоматически генерируется. – user2023370