1

私はPythonのような構造を解析するための簡単な文法を試しています。これは、リスト/セットに対して思いつくことができるものです。

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

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

これはantlrにあることに注意してください、私はその正確さと私を助けるだろうリソースについて知りたいと思いました

Pythonの文法http://docs.python.org/reference/grammar.htmlを調べましたが、リストのリスト、リストのセット、またはセットのリストなどを処理していることがよくわかりませんでした。

どんな助けでもいただければ幸いです。

4

2 に答える 2

3

リストのリスト、リストのセット、またはセットのリストなどを処理していることを完全に理解できませんでした。

リストとセットなどを区別しません。

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

あなたが説明している種類の再帰を処理する方法はlistmakerdictorsetmakerなどが最終的にを含む可能性があるということです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)* [','] '}'
于 2012-04-10T01:47:24.003 に答える
1

これはあなたが求めているものに近いかもしれません:

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

element: list | set | atom;

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

注:これまでantlrを使用したことはありません。これは、正しい構文ではない可能性があります。

于 2012-04-10T01:13:31.523 に答える