2012-04-10 3 views
1

я пытаюсь простой грамматики для разбора питона структур, это то, что я мог бы придумать для списка/комплектBNF Грамматика для структур питона стиля

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

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

Обратите внимание, что это в ANTLR, я хотел знать о его правильности и любых ресурсах, которые помогли бы мне

Я действительно смотрел грамматику python http://docs.python.org/reference/grammar.html, но не мог понять, что он обрабатывал список списков или набор списков или список наборов и т. д. .

Любая помощь будет оценена по достоинству.

ответ

3

не мог понять, что был список списков обработки или набор списков или список наборов и т.д ..

Он не различает списки из наборов или любой другой:

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

Способ, которым они обрабатывают рекурсию, которую вы описываете, состоит в том, что listmaker, dictorsetmaker и т. Д. В конечном итоге может содержать atom. Например:

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] 

Существует много промежуточных звеньев; это потому, что им необходимо установить приоритет для кучки математических операторов. Затем там list_for, что позволяет добавлять дополнительные материалы для понимания списка.

Гораздо более простой пример может выглядеть следующим образом:

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

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

Или, если вы хотите, различие между списками и устанавливает, чтобы быть на этом уровне:

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

«Он не различает» неправильно; есть, разумеется, отдельные команды «listmaker» и «dictorsetmaker», и синтаксический анализатор может полагаться на это, чтобы построить AST вместо того, чтобы перепроверять скобки, чтобы выяснить, что у него есть. –

1

Это может быть ближе к тому, что вы после:

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

element: list | set | atom; 

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

Примечание: никогда не использовали ANTLR ранее, это может быть не правильный синтаксис.