開発環境
- OS: macOS High Sierra - Apple
- Text Editor: Emacs
- プログラミング言語: Python
ということで、SION.g4を書いてみることに。まずはSIONの「各種データのサポート状況」を見ながら書いてみて、次にLexical Structureを見ながらちょっと修正してみた。
SION.g4
// Created by kamimura on 2018/07/21.
// Copyright © 2018 kamimura. All rights reserved.
grammar SION;
si_self : si_nil
| si_bool
| si_bool
| si_int
| si_double
| si_string
| SI_DATA
| si_date
| si_array
| si_map
;
si_nil: 'nil';
si_bool: si_true
| si_false
;
si_true: 'true';
si_false: 'false';
si_int: SI_SIGN? si_ints;
si_ints: si_bin
| si_oct
| SI_DECIMAL
| si_hex
;
si_bin:'0b' si_bin_digits;
si_bin_digits: ('0'|'1') ('0'|'1'|'_')*;
si_oct:'0o' SI_OCT_DIGIT;
SI_OCT_DIGIT: [0-7][_0-7]*;
SI_DECIMAL: [0-9]+ [_0-9]*;
si_hex: '0x' SI_HEX_DIGIT;
SI_HEX_DIGIT: [0-9a-fA-F] [_0-9a-fA-F]*;
si_double: SI_DOUBLE_DECIMAL
| SI_DOUBLE_HEX
;
SI_DOUBLE_DECIMAL: [0-9][_0-9]* '.' ([0-9][_0-9]*)*
| [0-9][_0-9]* ('.' ([0-9][_0-9]*)*)? SI_DECIMAL_EXP;
SI_DECIMAL_EXP: ('e'|'E') SI_SIGN? SI_DECIMAL;
SI_DOUBLE_HEX: '0x' SI_HEX_DIGITS;
SI_HEX_DIGITS: SI_HEX_DIGIT ('.' SI_HEX_DIGIT)? SI_HEX_EXP;
SI_HEX_EXP: ('p'|'P') SI_SIGN? SI_DECIMAL;
SI_SIGN: ('+'|'-');
si_string: si_string_line
| si_string_multiline
;
si_string_line: '"' si_string_line_element '"';
si_string_line_element: ( SI_ESC | . | SI_UNICODE)*?;
si_string_multiline: '"""' si_string_multiline_element '"""';
si_string_multiline_element: ( SI_ESC | . | SI_UNICODE | '\r'?'\n')*?;
SI_ESC: '\\' ["\\/bfnrt];
SI_UNICODE: [\u{000000}-\u{10ffff}];
SI_DATA: '.Data("' SI_BASE64* '")';
SI_BASE64: [a-zA-Z0-9+/=];
si_date: '.Date(' si_double ')';
si_array: si_array_empty
| '[' si_array_elements ']'
;
si_array_empty: '[' ']';
si_array_elements: si_self (',' si_self)*;
si_map: si_empty_map
| si_nonempty_map
;
si_empty_map: '[' ':' ']';
si_nonempty_map: '[' si_pair (',' si_pair)* ']';
si_pair: si_nil_key_pair
| si_bool_key_pair
| si_int_key_pair
| si_double_key_pair
| si_string_key_pair
| si_array_key_pair
| si_map_key_pair
;
si_nil_key_pair: si_nil ':' si_self;
si_bool_key_pair: si_bool ':' si_self;
si_int_key_pair: si_int ':' si_self;
si_double_key_pair: si_double ':' si_self;
si_string_key_pair: si_string ':' si_self;
si_array_key_pair: si_array ':' si_self;
si_map_key_pair: si_map ':' si_self;
COMMENT: '//' .*? '\r'? '\n' -> skip;
WS: [ \t\n\r]+ -> skip ;
各ルールの最初に全て「si」(SIONのSI)を付けたのは、target言語(試したのは Java と Python)の予約語と衝突してエラーになる場合があったからで、それなら最初から全てに「si」を付けておけば、あとあと問題が起こりにくいかなぁと考えて。
大文字、小文字の違いは、小文字でエラーになった場合に大文字に書き直したらエラーがなくなったからそうしてみたという理由で、ANTLRでの大文字小文字の違いはまだよく分かってなかったり。(このことについては、The Definitive ANTLR 4 Referenceをしっかり読み返せば分かりそう。)
必要以上に(?)できるだけルールを細かく分けて書いたのは、後々他の言語(ANTLR4はJava、C#、Python、JavaScript、Go、C++、Swiftに対応してるみたい)で作成するときに役立つかもしれないと考えて。
次回は、出来上がったSIONVisitor.pyを編集してみることに。
(意外に早くできたら、これとは逆方向のPython のオブジェクトをSIONに変換するのをちゃんと修正、追加等してくっつけようかなぁと思ってみたり。)
0 コメント:
コメントを投稿