2012-04-10 8 views
1

ich auf eine einfache Grammatik versuchen Python wie Strukturen für die Analyse, das ist, was ich mit für eine Liste einfiel/setBNF Grammar für Python-Stil Strukturen

list : '[' atom (',' atom)* ']' 
set : '(' atom (',' atom)* ']' 

atom : 'a'..'z' | 'A'..'Z' 
    | '[' list ']' 
    | '(' set ')' 

Beachten Sie, dass dies in antlr, ich wollte wissen über seine Richtigkeit und Ressourcen, die mir helfen würde

Ich schaute auf die Python 'Grammatik http://docs.python.org/reference/grammar.html, aber konnte nicht ganz herausfinden, es war die Handhabung der Liste von Listen oder Satz von Listen oder Liste der Sätze usw.

Jede Hilfe würde geschätzt.

Antwort

3

konnte nicht ganz herausfinden, es Liste von Listen wurde die Handhabung oder von Listen oder eine Liste von Sätzen usw. eingestellt ..

Es Listen von Sätzen oder was auch immer nicht unterscheiden:

atom: ('(' [yield_expr|testlist_comp] ')' | 
     '[' [listmaker] ']' | 
     '{' [dictorsetmaker] '}' | 
     '`' testlist1 '`' | 
     NAME | NUMBER | STRING+) 

Die Art, wie sie die Rekursion der Art handhaben, die Sie beschreiben, ist, dass listmaker, dictorsetmaker usw. schließlich atom enthalten kann. Zum Beispiel:

listmaker: test (list_for | (',' test)* [',']) 
test: or_test ['if' or_test 'else' test] | lambdef 
or_test: and_test ('or' and_test)* 
and_test: not_test ('and' not_test)* 
not_test: 'not' not_test | comparison 
comparison: expr (comp_op expr)* 
expr: xor_expr ('|' xor_expr)* 
xor_expr: and_expr ('^' and_expr)* 
and_expr: shift_expr ('&' shift_expr)* 
shift_expr: arith_expr (('<<'|'>>') arith_expr)* 
arith_expr: term (('+'|'-') term)* 
term: factor (('*'|'/'|'%'|'//') factor)* 
factor: ('+'|'-'|'~') factor | power 
power: atom trailer* ['**' factor] 

Es gibt viele Zwischenprodukte; Das liegt daran, dass sie für eine Reihe mathematischer Operatoren Vorrang haben müssen. Dann gibt es list_for, die das Hinzufügen der zusätzlichen Sachen für ein Listenverständnis erlaubt.

Ein wesentlich vereinfachtes Beispiel könnte wie folgt aussehen:

atom: ('[' [list_or_set] ']' | 
     '{' [list_or_set] '}' | 
     NAME | NUMBER | STRING+) 

list_or_set: atom (',' atom)* [','] 

Oder wenn Sie den Unterschied zwischen den Listen will und setzt auf dieser Ebene getroffen werden:

atom: list | set | NAME | NUMBER | STRING+ 
list: '[' atom (',' atom)* [','] ']' 
set: '{' atom (',' atom)* [','] '}' 
+0

„Es unterscheidet nicht“ ist falsch; es gibt natürlich getrennte 'listmaker'- und' dictorsetmaker'-Produktionen, und der Parser kann sich darauf verlassen, um den AST zu bauen, anstatt die Klammern erneut prüfen zu müssen, um herauszufinden, was er hat. –

1

Dies könnte näher an, was Sie nach:

list : '[' element (',' element)* ']'; 
set : '(' element (',' element)* ')'; 

element: list | set | atom; 

alpha: 'a'..'z' | 'A'..'Z' | '_' ; 
alphanum: alpha | '0'..'9'; 
atom : alpha alphanum*; 

Hinweis: Noch nie verwendet antlr, ist dies nicht die korrekte Syntax sein kann.