我正在尝试在antlr中实现python格式化:
grammar formatter;
source_stream
: segments EOF
;
segments
: segment*
;
segment
: (text | replacement_field)
;
text
: TEXT
;
replacement_field
: '{' field_name? ('!' conversion)? (':' format_spec)? '}'
;
field_name
: arg_name (('.'attribute_name) | '[' element_index ']')*
;
arg_name
: (identifier | integer)?
;
attribute_name
: identifier
;
element_index
: integer | index_string
;
index_string
: string
;
identifier
: NAME
;
conversion
: 's'
;
format_spec
: (fill? align)? sign? hash? zero? width? dash? precision? type?
;
fill
: FILL_ANY_CHAR
;
align
: '<' | '>' | '=' | '^'
;
sign
: '+' | '-' | ' '
;
hash
: '#'
;
zero
: '0'
;
width
: integer
;
precision
: integer
;
type
: 'b' | 'c' | 'd' | 'e' | 'E' | 'f' | 'g' | 'G' | 'n' | 'o' | 's' | 'x' | 'X' | '%'
;
dash
: ','
;
string
: STRING
;
STRING
: STRING_NO_BRACKET+
;
STRING_NO_BRACKET
: [u0000-u005C]
| [u005E-u007F]
;
TEXT
: ANY
;
ANY
: .
;
integer
: DECIMAL_INTEGER
| OCT_INTEGER
| HEX_INTEGER
| BIN_INTEGER
;
DECIMAL_INTEGER
: NON_ZERO_DIGIT DIGIT*
| '0'+
;
OCT_INTEGER
: '0' [oO] OCT_DIGIT+
;
HEX_INTEGER
: '0' [xX] HEX_DIGIT+
;
BIN_INTEGER
: '0' [bB]? BIN_DIGIT+
;
FILL_ANY_CHAR
: FILL
;
fragment FILL
: [u0000-u007F]
;
NAME
: ID_START ID_CONTINUE*
;
fragment NON_ZERO_DIGIT
: [1-9]
;
fragment DIGIT
: [0-9]
;
fragment OCT_DIGIT
: [0-7]
;
fragment HEX_DIGIT
: [0-9a-fA-F]
;
fragment BIN_DIGIT
: [01]
;
fragment ID_START
: '_'
| [A-Z]
| [a-z]
| 'u00AA'
| 'u00B5'
| 'u00BA'
| [u00C0-u00D6]
| [u00D8-u00F6]
| [u00F8-u01BA]
| 'u01BB'
| [u01BC-u01BF]
| [u01C0-u01C3]
| [u01C4-u0241]
| [u0250-u02AF]
| [u02B0-u02C1]
| [u02C6-u02D1]
| [u02E0-u02E4]
| 'u02EE'
| 'u037A'
| 'u0386'
| [u0388-u038A]
| 'u038C'
| [u038E-u03A1]
| [u03A3-u03CE]
| [u03D0-u03F5]
| [u03F7-u0481]
| [u048A-u04CE]
| [u04D0-u04F9]
| [u0500-u050F]
| [u0531-u0556]
| 'u0559'
| [u0561-u0587]
| [u05D0-u05EA]
| [u05F0-u05F2]
| [u0621-u063A]
| 'u0640'
| [u0641-u064A]
| [u066E-u066F]
| [u0671-u06D3]
| 'u06D5'
| [u06E5-u06E6]
| [u06EE-u06EF]
| [u06FA-u06FC]
| 'u06FF'
| 'u0710'
| [u0712-u072F]
| [u074D-u076D]
| [u0780-u07A5]
| 'u07B1'
| [u0904-u0939]
| 'u093D'
| 'u0950'
| [u0958-u0961]
| 'u097D'
| [u0985-u098C]
| [u098F-u0990]
| [u0993-u09A8]
| [u09AA-u09B0]
| 'u09B2'
| [u09B6-u09B9]
| 'u09BD'
| 'u09CE'
| [u09DC-u09DD]
| [u09DF-u09E1]
| [u09F0-u09F1]
| [u0A05-u0A0A]
| [u0A0F-u0A10]
| [u0A13-u0A28]
| [u0A2A-u0A30]
| [u0A32-u0A33]
| [u0A35-u0A36]
| [u0A38-u0A39]
| [u0A59-u0A5C]
| 'u0A5E'
| [u0A72-u0A74]
| [u0A85-u0A8D]
| [u0A8F-u0A91]
| [u0A93-u0AA8]
| [u0AAA-u0AB0]
| [u0AB2-u0AB3]
| [u0AB5-u0AB9]
| 'u0ABD'
| 'u0AD0'
| [u0AE0-u0AE1]
| [u0B05-u0B0C]
| [u0B0F-u0B10]
| [u0B13-u0B28]
| [u0B2A-u0B30]
| [u0B32-u0B33]
| [u0B35-u0B39]
| 'u0B3D'
| [u0B5C-u0B5D]
| [u0B5F-u0B61]
| 'u0B71'
| 'u0B83'
| [u0B85-u0B8A]
| [u0B8E-u0B90]
| [u0B92-u0B95]
| [u0B99-u0B9A]
| 'u0B9C'
| [u0B9E-u0B9F]
| [u0BA3-u0BA4]
| [u0BA8-u0BAA]
| [u0BAE-u0BB9]
| [u0C05-u0C0C]
| [u0C0E-u0C10]
| [u0C12-u0C28]
| [u0C2A-u0C33]
| [u0C35-u0C39]
| [u0C60-u0C61]
| [u0C85-u0C8C]
| [u0C8E-u0C90]
| [u0C92-u0CA8]
| [u0CAA-u0CB3]
| [u0CB5-u0CB9]
| 'u0CBD'
| 'u0CDE'
| [u0CE0-u0CE1]
| [u0D05-u0D0C]
| [u0D0E-u0D10]
| [u0D12-u0D28]
| [u0D2A-u0D39]
| [u0D60-u0D61]
| [u0D85-u0D96]
| [u0D9A-u0DB1]
| [u0DB3-u0DBB]
| 'u0DBD'
| [u0DC0-u0DC6]
| [u0E01-u0E30]
| [u0E32-u0E33]
| [u0E40-u0E45]
| 'u0E46'
| [u0E81-u0E82]
| 'u0E84'
| [u0E87-u0E88]
| 'u0E8A'
| 'u0E8D'
| [u0E94-u0E97]
| [u0E99-u0E9F]
| [u0EA1-u0EA3]
| 'u0EA5'
| 'u0EA7'
| [u0EAA-u0EAB]
| [u0EAD-u0EB0]
| [u0EB2-u0EB3]
| 'u0EBD'
| [u0EC0-u0EC4]
| 'u0EC6'
| [u0EDC-u0EDD]
| 'u0F00'
| [u0F40-u0F47]
| [u0F49-u0F6A]
| [u0F88-u0F8B]
| [u1000-u1021]
| [u1023-u1027]
| [u1029-u102A]
| [u1050-u1055]
| [u10A0-u10C5]
| [u10D0-u10FA]
| 'u10FC'
| [u1100-u1159]
| [u115F-u11A2]
| [u11A8-u11F9]
| [u1200-u1248]
| [u124A-u124D]
| [u1250-u1256]
| 'u1258'
| [u125A-u125D]
| [u1260-u1288]
| [u128A-u128D]
| [u1290-u12B0]
| [u12B2-u12B5]
| [u12B8-u12BE]
| 'u12C0'
| [u12C2-u12C5]
| [u12C8-u12D6]
| [u12D8-u1310]
| [u1312-u1315]
| [u1318-u135A]
| [u1380-u138F]
| [u13A0-u13F4]
| [u1401-u166C]
| [u166F-u1676]
| [u1681-u169A]
| [u16A0-u16EA]
| [u16EE-u16F0]
| [u1700-u170C]
| [u170E-u1711]
| [u1720-u1731]
| [u1740-u1751]
| [u1760-u176C]
| [u176E-u1770]
| [u1780-u17B3]
| 'u17D7'
| 'u17DC'
| [u1820-u1842]
| 'u1843'
| [u1844-u1877]
| [u1880-u18A8]
| [u1900-u191C]
| [u1950-u196D]
| [u1970-u1974]
| [u1980-u19A9]
| [u19C1-u19C7]
| [u1A00-u1A16]
| [u1D00-u1D2B]
| [u1D2C-u1D61]
| [u1D62-u1D77]
| 'u1D78'
| [u1D79-u1D9A]
| [u1D9B-u1DBF]
| [u1E00-u1E9B]
| [u1EA0-u1EF9]
| [u1F00-u1F15]
| [u1F18-u1F1D]
| [u1F20-u1F45]
| [u1F48-u1F4D]
| [u1F50-u1F57]
| 'u1F59'
| 'u1F5B'
| 'u1F5D'
| [u1F5F-u1F7D]
| [u1F80-u1FB4]
| [u1FB6-u1FBC]
| 'u1FBE'
| [u1FC2-u1FC4]
| [u1FC6-u1FCC]
| [u1FD0-u1FD3]
| [u1FD6-u1FDB]
| [u1FE0-u1FEC]
| [u1FF2-u1FF4]
| [u1FF6-u1FFC]
| 'u2071'
| 'u207F'
| [u2090-u2094]
| 'u2102'
| 'u2107'
| [u210A-u2113]
| 'u2115'
| 'u2118'
| [u2119-u211D]
| 'u2124'
| 'u2126'
| 'u2128'
| [u212A-u212D]
| 'u212E'
| [u212F-u2131]
| [u2133-u2134]
| [u2135-u2138]
| 'u2139'
| [u213C-u213F]
| [u2145-u2149]
| [u2160-u2183]
| [u2C00-u2C2E]
| [u2C30-u2C5E]
| [u2C80-u2CE4]
| [u2D00-u2D25]
| [u2D30-u2D65]
| 'u2D6F'
| [u2D80-u2D96]
| [u2DA0-u2DA6]
| [u2DA8-u2DAE]
| [u2DB0-u2DB6]
| [u2DB8-u2DBE]
| [u2DC0-u2DC6]
| [u2DC8-u2DCE]
| [u2DD0-u2DD6]
| [u2DD8-u2DDE]
| 'u3005'
| 'u3006'
| 'u3007'
| [u3021-u3029]
| [u3031-u3035]
| [u3038-u303A]
| 'u303B'
| 'u303C'
| [u3041-u3096]
| [u309B-u309C]
| [u309D-u309E]
| 'u309F'
| [u30A1-u30FA]
| [u30FC-u30FE]
| 'u30FF'
| [u3105-u312C]
| [u3131-u318E]
| [u31A0-u31B7]
| [u31F0-u31FF]
| [u3400-u4DB5]
| [u4E00-u9FBB]
| [uA000-uA014]
| 'uA015'
| [uA016-uA48C]
| [uA800-uA801]
| [uA803-uA805]
| [uA807-uA80A]
| [uA80C-uA822]
| [uAC00-uD7A3]
| [uF900-uFA2D]
| [uFA30-uFA6A]
| [uFA70-uFAD9]
| [uFB00-uFB06]
| [uFB13-uFB17]
| 'uFB1D'
| [uFB1F-uFB28]
| [uFB2A-uFB36]
| [uFB38-uFB3C]
| 'uFB3E'
| [uFB40-uFB41]
| [uFB43-uFB44]
| [uFB46-uFBB1]
| [uFBD3-uFD3D]
| [uFD50-uFD8F]
| [uFD92-uFDC7]
| [uFDF0-uFDFB]
| [uFE70-uFE74]
| [uFE76-uFEFC]
| [uFF21-uFF3A]
| [uFF41-uFF5A]
| [uFF66-uFF6F]
| 'uFF70'
| [uFF71-uFF9D]
| [uFF9E-uFF9F]
| [uFFA0-uFFBE]
| [uFFC2-uFFC7]
| [uFFCA-uFFCF]
| [uFFD2-uFFD7]
| [uFFDA-uFFDC]
;
fragment ID_CONTINUE
: ID_START
| [0-9]
| [u0300-u036F]
| [u0483-u0486]
| [u0591-u05B9]
| [u05BB-u05BD]
| 'u05BF'
| [u05C1-u05C2]
| [u05C4-u05C5]
| 'u05C7'
| [u0610-u0615]
| [u064B-u065E]
| [u0660-u0669]
| 'u0670'
| [u06D6-u06DC]
| [u06DF-u06E4]
| [u06E7-u06E8]
| [u06EA-u06ED]
| [u06F0-u06F9]
| 'u0711'
| [u0730-u074A]
| [u07A6-u07B0]
| [u0901-u0902]
| 'u0903'
| 'u093C'
| [u093E-u0940]
| [u0941-u0948]
| [u0949-u094C]
| 'u094D'
| [u0951-u0954]
| [u0962-u0963]
| [u0966-u096F]
| 'u0981'
| [u0982-u0983]
| 'u09BC'
| [u09BE-u09C0]
| [u09C1-u09C4]
| [u09C7-u09C8]
| [u09CB-u09CC]
| 'u09CD'
| 'u09D7'
| [u09E2-u09E3]
| [u09E6-u09EF]
| [u0A01-u0A02]
| 'u0A03'
| 'u0A3C'
| [u0A3E-u0A40]
| [u0A41-u0A42]
| [u0A47-u0A48]
| [u0A4B-u0A4D]
| [u0A66-u0A6F]
| [u0A70-u0A71]
| [u0A81-u0A82]
| 'u0A83'
| 'u0ABC'
| [u0ABE-u0AC0]
| [u0AC1-u0AC5]
| [u0AC7-u0AC8]
| 'u0AC9'
| [u0ACB-u0ACC]
| 'u0ACD'
| [u0AE2-u0AE3]
| [u0AE6-u0AEF]
| 'u0B01'
| [u0B02-u0B03]
| 'u0B3C'
| 'u0B3E'
| 'u0B3F'
| 'u0B40'
| [u0B41-u0B43]
| [u0B47-u0B48]
| [u0B4B-u0B4C]
| 'u0B4D'
| 'u0B56'
| 'u0B57'
| [u0B66-u0B6F]
| 'u0B82'
| [u0BBE-u0BBF]
| 'u0BC0'
| [u0BC1-u0BC2]
| [u0BC6-u0BC8]
| [u0BCA-u0BCC]
| 'u0BCD'
| 'u0BD7'
| [u0BE6-u0BEF]
| [u0C01-u0C03]
| [u0C3E-u0C40]
| [u0C41-u0C44]
| [u0C46-u0C48]
| [u0C4A-u0C4D]
| [u0C55-u0C56]
| [u0C66-u0C6F]
| [u0C82-u0C83]
| 'u0CBC'
| 'u0CBE'
| 'u0CBF'
| [u0CC0-u0CC4]
| 'u0CC6'
| [u0CC7-u0CC8]
| [u0CCA-u0CCB]
| [u0CCC-u0CCD]
| [u0CD5-u0CD6]
| [u0CE6-u0CEF]
| [u0D02-u0D03]
| [u0D3E-u0D40]
| [u0D41-u0D43]
| [u0D46-u0D48]
| [u0D4A-u0D4C]
| 'u0D4D'
| 'u0D57'
| [u0D66-u0D6F]
| [u0D82-u0D83]
| 'u0DCA'
| [u0DCF-u0DD1]
| [u0DD2-u0DD4]
| 'u0DD6'
| [u0DD8-u0DDF]
| [u0DF2-u0DF3]
| 'u0E31'
| [u0E34-u0E3A]
| [u0E47-u0E4E]
| [u0E50-u0E59]
| 'u0EB1'
| [u0EB4-u0EB9]
| [u0EBB-u0EBC]
| [u0EC8-u0ECD]
| [u0ED0-u0ED9]
| [u0F18-u0F19]
| [u0F20-u0F29]
| 'u0F35'
| 'u0F37'
| 'u0F39'
| [u0F3E-u0F3F]
| [u0F71-u0F7E]
| 'u0F7F'
| [u0F80-u0F84]
| [u0F86-u0F87]
| [u0F90-u0F97]
| [u0F99-u0FBC]
| 'u0FC6'
| 'u102C'
| [u102D-u1030]
| 'u1031'
| 'u1032'
| [u1036-u1037]
| 'u1038'
| 'u1039'
| [u1040-u1049]
| [u1056-u1057]
| [u1058-u1059]
| 'u135F'
| [u1369-u1371]
| [u1712-u1714]
| [u1732-u1734]
| [u1752-u1753]
| [u1772-u1773]
| 'u17B6'
| [u17B7-u17BD]
| [u17BE-u17C5]
| 'u17C6'
| [u17C7-u17C8]
| [u17C9-u17D3]
| 'u17DD'
| [u17E0-u17E9]
| [u180B-u180D]
| [u1810-u1819]
| 'u18A9'
| [u1920-u1922]
| [u1923-u1926]
| [u1927-u1928]
| [u1929-u192B]
| [u1930-u1931]
| 'u1932'
| [u1933-u1938]
| [u1939-u193B]
| [u1946-u194F]
| [u19B0-u19C0]
| [u19C8-u19C9]
| [u19D0-u19D9]
| [u1A17-u1A18]
| [u1A19-u1A1B]
| [u1DC0-u1DC3]
| [u203F-u2040]
| 'u2054'
| [u20D0-u20DC]
| 'u20E1'
| [u20E5-u20EB]
| [u302A-u302F]
| [u3099-u309A]
| 'uA802'
| 'uA806'
| 'uA80B'
| [uA823-uA824]
| [uA825-uA826]
| 'uA827'
| 'uFB1E'
| [uFE00-uFE0F]
| [uFE20-uFE23]
| [uFE33-uFE34]
| [uFE4D-uFE4F]
| [uFF10-uFF19]
| 'uFF3F'
;
然而,无论我给它什么输入,它都不会匹配任何东西。输入"测试": line 1:0 extraneous input 'test' expecting {<EOF>, '{', TEXT}
输入"{}": line 1:0 extraneous input '{}' expecting {<EOF>, '{', TEXT}
输入"{测试}": line 1:0 extraneous input '{test}' expecting {<EOF>, '{', TEXT}
我错过了什么基本的东西吗?由于某种原因,无论输入是什么,lexer只是将其作为一个完整的令牌返回,而不是对其进行词法分析。在例2和例3中,'{'应该匹配规则,但没有匹配。
详细错误:
enter source_stream, LT(1)={test}
enter segments, LT(1)={test}
line 1:0 extraneous input '{test}' expecting {<EOF>, '{', TEXT}
exit segments, LT(1)=<EOF>
consume [@1,6:5='<EOF>',<-1>,1:6] rule source_stream
exit source_stream, LT(1)=<EOF>
好吧,经过仔细的思考和考虑,我已经发现,我想要的是不可能的lexer+解析器语法的antlr,因为一切都将匹配在一个大范围的lexer规则。解决方案:将词法分析器和解析器拆分为两个语法,并使用词法分析器模式进行正确的解析:
词法分析程序的语法:
lexer grammar formatterLexer;
OPEN_RF: '{' -> pushMode(RuleMode);
CHAR_NOCURLY
: ~('{' | '}')
;
mode StringMode;
CHAR_NORIGHTB
: ~(']')
;
RIX: ']' -> popMode;
mode RuleMode;
EXLM: '!' ;
COLON: ':' ;
DOT: '.' ;
CLOSE_RF: '}' -> popMode;
LIX: '[' -> pushMode(StringMode);
LS: 's';
LT: '<';
MT: '>';
EQ: '=';
EXP: '^';
PLUS: '+';
MINUS: '-';
SPACE: ' ';
HASH: '#';
ZERO: '0';
TYPE: 'b' | 'c' | 'd' | 'e' | 'E' | 'f' | 'g' | 'G' | 'n' | 'o' | 's' | 'x' | 'X' | '%';
COMMA: ',';
CHAR: ~('{' | '}') ;
INTEGER
: DECIMAL_INTEGER
| OCT_INTEGER
| HEX_INTEGER
| BIN_INTEGER
;
DECIMAL_INTEGER
: NON_ZERO_DIGIT DIGIT*
| '0'+
;
OCT_INTEGER
: '0' [oO] OCT_DIGIT+
;
HEX_INTEGER
: '0' [xX] HEX_DIGIT+
;
BIN_INTEGER
: '0' [bB]? BIN_DIGIT+
;
NAME
: ID_START ID_CONTINUE*
;
fragment NON_ZERO_DIGIT
: [1-9]
;
fragment DIGIT
: [0-9]
;
fragment OCT_DIGIT
: [0-7]
;
fragment HEX_DIGIT
: [0-9a-fA-F]
;
fragment BIN_DIGIT
: [01]
;
fragment ID_START
: '_'
| [A-Z]
| [a-z]
| 'u00AA'
| 'u00B5'
| 'u00BA'
| [u00C0-u00D6]
| [u00D8-u00F6]
| [u00F8-u01BA]
| 'u01BB'
| [u01BC-u01BF]
| [u01C0-u01C3]
| [u01C4-u0241]
| [u0250-u02AF]
| [u02B0-u02C1]
| [u02C6-u02D1]
| [u02E0-u02E4]
| 'u02EE'
| 'u037A'
| 'u0386'
| [u0388-u038A]
| 'u038C'
| [u038E-u03A1]
| [u03A3-u03CE]
| [u03D0-u03F5]
| [u03F7-u0481]
| [u048A-u04CE]
| [u04D0-u04F9]
| [u0500-u050F]
| [u0531-u0556]
| 'u0559'
| [u0561-u0587]
| [u05D0-u05EA]
| [u05F0-u05F2]
| [u0621-u063A]
| 'u0640'
| [u0641-u064A]
| [u066E-u066F]
| [u0671-u06D3]
| 'u06D5'
| [u06E5-u06E6]
| [u06EE-u06EF]
| [u06FA-u06FC]
| 'u06FF'
| 'u0710'
| [u0712-u072F]
| [u074D-u076D]
| [u0780-u07A5]
| 'u07B1'
| [u0904-u0939]
| 'u093D'
| 'u0950'
| [u0958-u0961]
| 'u097D'
| [u0985-u098C]
| [u098F-u0990]
| [u0993-u09A8]
| [u09AA-u09B0]
| 'u09B2'
| [u09B6-u09B9]
| 'u09BD'
| 'u09CE'
| [u09DC-u09DD]
| [u09DF-u09E1]
| [u09F0-u09F1]
| [u0A05-u0A0A]
| [u0A0F-u0A10]
| [u0A13-u0A28]
| [u0A2A-u0A30]
| [u0A32-u0A33]
| [u0A35-u0A36]
| [u0A38-u0A39]
| [u0A59-u0A5C]
| 'u0A5E'
| [u0A72-u0A74]
| [u0A85-u0A8D]
| [u0A8F-u0A91]
| [u0A93-u0AA8]
| [u0AAA-u0AB0]
| [u0AB2-u0AB3]
| [u0AB5-u0AB9]
| 'u0ABD'
| 'u0AD0'
| [u0AE0-u0AE1]
| [u0B05-u0B0C]
| [u0B0F-u0B10]
| [u0B13-u0B28]
| [u0B2A-u0B30]
| [u0B32-u0B33]
| [u0B35-u0B39]
| 'u0B3D'
| [u0B5C-u0B5D]
| [u0B5F-u0B61]
| 'u0B71'
| 'u0B83'
| [u0B85-u0B8A]
| [u0B8E-u0B90]
| [u0B92-u0B95]
| [u0B99-u0B9A]
| 'u0B9C'
| [u0B9E-u0B9F]
| [u0BA3-u0BA4]
| [u0BA8-u0BAA]
| [u0BAE-u0BB9]
| [u0C05-u0C0C]
| [u0C0E-u0C10]
| [u0C12-u0C28]
| [u0C2A-u0C33]
| [u0C35-u0C39]
| [u0C60-u0C61]
| [u0C85-u0C8C]
| [u0C8E-u0C90]
| [u0C92-u0CA8]
| [u0CAA-u0CB3]
| [u0CB5-u0CB9]
| 'u0CBD'
| 'u0CDE'
| [u0CE0-u0CE1]
| [u0D05-u0D0C]
| [u0D0E-u0D10]
| [u0D12-u0D28]
| [u0D2A-u0D39]
| [u0D60-u0D61]
| [u0D85-u0D96]
| [u0D9A-u0DB1]
| [u0DB3-u0DBB]
| 'u0DBD'
| [u0DC0-u0DC6]
| [u0E01-u0E30]
| [u0E32-u0E33]
| [u0E40-u0E45]
| 'u0E46'
| [u0E81-u0E82]
| 'u0E84'
| [u0E87-u0E88]
| 'u0E8A'
| 'u0E8D'
| [u0E94-u0E97]
| [u0E99-u0E9F]
| [u0EA1-u0EA3]
| 'u0EA5'
| 'u0EA7'
| [u0EAA-u0EAB]
| [u0EAD-u0EB0]
| [u0EB2-u0EB3]
| 'u0EBD'
| [u0EC0-u0EC4]
| 'u0EC6'
| [u0EDC-u0EDD]
| 'u0F00'
| [u0F40-u0F47]
| [u0F49-u0F6A]
| [u0F88-u0F8B]
| [u1000-u1021]
| [u1023-u1027]
| [u1029-u102A]
| [u1050-u1055]
| [u10A0-u10C5]
| [u10D0-u10FA]
| 'u10FC'
| [u1100-u1159]
| [u115F-u11A2]
| [u11A8-u11F9]
| [u1200-u1248]
| [u124A-u124D]
| [u1250-u1256]
| 'u1258'
| [u125A-u125D]
| [u1260-u1288]
| [u128A-u128D]
| [u1290-u12B0]
| [u12B2-u12B5]
| [u12B8-u12BE]
| 'u12C0'
| [u12C2-u12C5]
| [u12C8-u12D6]
| [u12D8-u1310]
| [u1312-u1315]
| [u1318-u135A]
| [u1380-u138F]
| [u13A0-u13F4]
| [u1401-u166C]
| [u166F-u1676]
| [u1681-u169A]
| [u16A0-u16EA]
| [u16EE-u16F0]
| [u1700-u170C]
| [u170E-u1711]
| [u1720-u1731]
| [u1740-u1751]
| [u1760-u176C]
| [u176E-u1770]
| [u1780-u17B3]
| 'u17D7'
| 'u17DC'
| [u1820-u1842]
| 'u1843'
| [u1844-u1877]
| [u1880-u18A8]
| [u1900-u191C]
| [u1950-u196D]
| [u1970-u1974]
| [u1980-u19A9]
| [u19C1-u19C7]
| [u1A00-u1A16]
| [u1D00-u1D2B]
| [u1D2C-u1D61]
| [u1D62-u1D77]
| 'u1D78'
| [u1D79-u1D9A]
| [u1D9B-u1DBF]
| [u1E00-u1E9B]
| [u1EA0-u1EF9]
| [u1F00-u1F15]
| [u1F18-u1F1D]
| [u1F20-u1F45]
| [u1F48-u1F4D]
| [u1F50-u1F57]
| 'u1F59'
| 'u1F5B'
| 'u1F5D'
| [u1F5F-u1F7D]
| [u1F80-u1FB4]
| [u1FB6-u1FBC]
| 'u1FBE'
| [u1FC2-u1FC4]
| [u1FC6-u1FCC]
| [u1FD0-u1FD3]
| [u1FD6-u1FDB]
| [u1FE0-u1FEC]
| [u1FF2-u1FF4]
| [u1FF6-u1FFC]
| 'u2071'
| 'u207F'
| [u2090-u2094]
| 'u2102'
| 'u2107'
| [u210A-u2113]
| 'u2115'
| 'u2118'
| [u2119-u211D]
| 'u2124'
| 'u2126'
| 'u2128'
| [u212A-u212D]
| 'u212E'
| [u212F-u2131]
| [u2133-u2134]
| [u2135-u2138]
| 'u2139'
| [u213C-u213F]
| [u2145-u2149]
| [u2160-u2183]
| [u2C00-u2C2E]
| [u2C30-u2C5E]
| [u2C80-u2CE4]
| [u2D00-u2D25]
| [u2D30-u2D65]
| 'u2D6F'
| [u2D80-u2D96]
| [u2DA0-u2DA6]
| [u2DA8-u2DAE]
| [u2DB0-u2DB6]
| [u2DB8-u2DBE]
| [u2DC0-u2DC6]
| [u2DC8-u2DCE]
| [u2DD0-u2DD6]
| [u2DD8-u2DDE]
| 'u3005'
| 'u3006'
| 'u3007'
| [u3021-u3029]
| [u3031-u3035]
| [u3038-u303A]
| 'u303B'
| 'u303C'
| [u3041-u3096]
| [u309B-u309C]
| [u309D-u309E]
| 'u309F'
| [u30A1-u30FA]
| [u30FC-u30FE]
| 'u30FF'
| [u3105-u312C]
| [u3131-u318E]
| [u31A0-u31B7]
| [u31F0-u31FF]
| [u3400-u4DB5]
| [u4E00-u9FBB]
| [uA000-uA014]
| 'uA015'
| [uA016-uA48C]
| [uA800-uA801]
| [uA803-uA805]
| [uA807-uA80A]
| [uA80C-uA822]
| [uAC00-uD7A3]
| [uF900-uFA2D]
| [uFA30-uFA6A]
| [uFA70-uFAD9]
| [uFB00-uFB06]
| [uFB13-uFB17]
| 'uFB1D'
| [uFB1F-uFB28]
| [uFB2A-uFB36]
| [uFB38-uFB3C]
| 'uFB3E'
| [uFB40-uFB41]
| [uFB43-uFB44]
| [uFB46-uFBB1]
| [uFBD3-uFD3D]
| [uFD50-uFD8F]
| [uFD92-uFDC7]
| [uFDF0-uFDFB]
| [uFE70-uFE74]
| [uFE76-uFEFC]
| [uFF21-uFF3A]
| [uFF41-uFF5A]
| [uFF66-uFF6F]
| 'uFF70'
| [uFF71-uFF9D]
| [uFF9E-uFF9F]
| [uFFA0-uFFBE]
| [uFFC2-uFFC7]
| [uFFCA-uFFCF]
| [uFFD2-uFFD7]
| [uFFDA-uFFDC]
;
fragment ID_CONTINUE
: ID_START
| [0-9]
| [u0300-u036F]
| [u0483-u0486]
| [u0591-u05B9]
| [u05BB-u05BD]
| 'u05BF'
| [u05C1-u05C2]
| [u05C4-u05C5]
| 'u05C7'
| [u0610-u0615]
| [u064B-u065E]
| [u0660-u0669]
| 'u0670'
| [u06D6-u06DC]
| [u06DF-u06E4]
| [u06E7-u06E8]
| [u06EA-u06ED]
| [u06F0-u06F9]
| 'u0711'
| [u0730-u074A]
| [u07A6-u07B0]
| [u0901-u0902]
| 'u0903'
| 'u093C'
| [u093E-u0940]
| [u0941-u0948]
| [u0949-u094C]
| 'u094D'
| [u0951-u0954]
| [u0962-u0963]
| [u0966-u096F]
| 'u0981'
| [u0982-u0983]
| 'u09BC'
| [u09BE-u09C0]
| [u09C1-u09C4]
| [u09C7-u09C8]
| [u09CB-u09CC]
| 'u09CD'
| 'u09D7'
| [u09E2-u09E3]
| [u09E6-u09EF]
| [u0A01-u0A02]
| 'u0A03'
| 'u0A3C'
| [u0A3E-u0A40]
| [u0A41-u0A42]
| [u0A47-u0A48]
| [u0A4B-u0A4D]
| [u0A66-u0A6F]
| [u0A70-u0A71]
| [u0A81-u0A82]
| 'u0A83'
| 'u0ABC'
| [u0ABE-u0AC0]
| [u0AC1-u0AC5]
| [u0AC7-u0AC8]
| 'u0AC9'
| [u0ACB-u0ACC]
| 'u0ACD'
| [u0AE2-u0AE3]
| [u0AE6-u0AEF]
| 'u0B01'
| [u0B02-u0B03]
| 'u0B3C'
| 'u0B3E'
| 'u0B3F'
| 'u0B40'
| [u0B41-u0B43]
| [u0B47-u0B48]
| [u0B4B-u0B4C]
| 'u0B4D'
| 'u0B56'
| 'u0B57'
| [u0B66-u0B6F]
| 'u0B82'
| [u0BBE-u0BBF]
| 'u0BC0'
| [u0BC1-u0BC2]
| [u0BC6-u0BC8]
| [u0BCA-u0BCC]
| 'u0BCD'
| 'u0BD7'
| [u0BE6-u0BEF]
| [u0C01-u0C03]
| [u0C3E-u0C40]
| [u0C41-u0C44]
| [u0C46-u0C48]
| [u0C4A-u0C4D]
| [u0C55-u0C56]
| [u0C66-u0C6F]
| [u0C82-u0C83]
| 'u0CBC'
| 'u0CBE'
| 'u0CBF'
| [u0CC0-u0CC4]
| 'u0CC6'
| [u0CC7-u0CC8]
| [u0CCA-u0CCB]
| [u0CCC-u0CCD]
| [u0CD5-u0CD6]
| [u0CE6-u0CEF]
| [u0D02-u0D03]
| [u0D3E-u0D40]
| [u0D41-u0D43]
| [u0D46-u0D48]
| [u0D4A-u0D4C]
| 'u0D4D'
| 'u0D57'
| [u0D66-u0D6F]
| [u0D82-u0D83]
| 'u0DCA'
| [u0DCF-u0DD1]
| [u0DD2-u0DD4]
| 'u0DD6'
| [u0DD8-u0DDF]
| [u0DF2-u0DF3]
| 'u0E31'
| [u0E34-u0E3A]
| [u0E47-u0E4E]
| [u0E50-u0E59]
| 'u0EB1'
| [u0EB4-u0EB9]
| [u0EBB-u0EBC]
| [u0EC8-u0ECD]
| [u0ED0-u0ED9]
| [u0F18-u0F19]
| [u0F20-u0F29]
| 'u0F35'
| 'u0F37'
| 'u0F39'
| [u0F3E-u0F3F]
| [u0F71-u0F7E]
| 'u0F7F'
| [u0F80-u0F84]
| [u0F86-u0F87]
| [u0F90-u0F97]
| [u0F99-u0FBC]
| 'u0FC6'
| 'u102C'
| [u102D-u1030]
| 'u1031'
| 'u1032'
| [u1036-u1037]
| 'u1038'
| 'u1039'
| [u1040-u1049]
| [u1056-u1057]
| [u1058-u1059]
| 'u135F'
| [u1369-u1371]
| [u1712-u1714]
| [u1732-u1734]
| [u1752-u1753]
| [u1772-u1773]
| 'u17B6'
| [u17B7-u17BD]
| [u17BE-u17C5]
| 'u17C6'
| [u17C7-u17C8]
| [u17C9-u17D3]
| 'u17DD'
| [u17E0-u17E9]
| [u180B-u180D]
| [u1810-u1819]
| 'u18A9'
| [u1920-u1922]
| [u1923-u1926]
| [u1927-u1928]
| [u1929-u192B]
| [u1930-u1931]
| 'u1932'
| [u1933-u1938]
| [u1939-u193B]
| [u1946-u194F]
| [u19B0-u19C0]
| [u19C8-u19C9]
| [u19D0-u19D9]
| [u1A17-u1A18]
| [u1A19-u1A1B]
| [u1DC0-u1DC3]
| [u203F-u2040]
| 'u2054'
| [u20D0-u20DC]
| 'u20E1'
| [u20E5-u20EB]
| [u302A-u302F]
| [u3099-u309A]
| 'uA802'
| 'uA806'
| 'uA80B'
| [uA823-uA824]
| [uA825-uA826]
| 'uA827'
| 'uFB1E'
| [uFE00-uFE0F]
| [uFE20-uFE23]
| [uFE33-uFE34]
| [uFE4D-uFE4F]
| [uFF10-uFF19]
| 'uFF3F'
;
使用两种模式,我可以准确地模拟python格式化器想要的。
语法:parser grammar formatterParser;
options { tokenVocab = formatterLexer; }
source_stream
: segments EOF
;
segments
: segment*
;
segment
: (text | replacement_field)
;
text
: CHAR_NOCURLY+
;
replacement_field
: OPEN_RF field_name? (EXLM conversion)? (COLON format_spec)? CLOSE_RF
;
field_name
: arg_name ((DOT attribute_name) | LIX element_index RIX)*
;
arg_name
: (identifier | INTEGER)?
;
attribute_name
: identifier
;
element_index
: INTEGER | index_string
;
index_string
: CHAR_NORIGHTB+
;
identifier
: NAME
;
conversion
: LS
;
format_spec
: (fill? align)? sign? hash? zero? width? dash? precision? type?
;
fill
: CHAR
;
align
: LT | MT | EQ | EXP
;
sign
: PLUS | MINUS | SPACE
;
hash
: HASH
;
zero
: ZERO
;
width
: INTEGER
;
precision
: INTEGER
;
type
: TYPE
;
dash
: COMMA
;