用于拆分数字的antlr4语法
antlr4 grammar for splitting the number
grammar Te;
/*
* Parser Rules
*/
test : (example+ EOF);
example: digit COMMA digit2 NEWLINE;
digit: (INT)+? ;
digit2: (INT INT INT INT)+?;
/*
* Lexer Rules
*/
INT :[0-9];
COMMA: ',';
NEWLINE : ('\r'? '\n' | '\r')+ ;
这是我编写的语法,用于将数字序列考虑为一位数,直到检测到逗号,然后将数字序列考虑为 4 位数字
比如我输入00000,12345678912345678912
现在它应该考虑 00000 并将其拆分为单个数字,如
token 1 =0,
token 2 =0,
token 3 =0,
token 4 =0,
token 5 =0,
在 COMMA 之后应该考虑 12345678912345678912
像
一样分裂
token 1 =1234,
token 2 =5678,
token 3 =9123,
token 4 =4567,
token 5 =8912,
但它没有采用第二条规则并将其打印为逗号后的单个数字
任何人,请帮助
提前致谢
你几乎做对了。您犯的唯一错误是您想循环解析器规则而不是词法分析器规则。因此你的语法应该是这样的:
example: digit+ COMMA digit2+ NEWLINE ;
digit: INT ;
digit2: INT INT INT INT ;
grammar Te;
/*
* Parser Rules
*/
test : (example+ EOF);
example: digit COMMA digit2 NEWLINE;
digit: (INT)+? ;
digit2: (INT INT INT INT)+?;
/*
* Lexer Rules
*/
INT :[0-9];
COMMA: ',';
NEWLINE : ('\r'? '\n' | '\r')+ ;
这是我编写的语法,用于将数字序列考虑为一位数,直到检测到逗号,然后将数字序列考虑为 4 位数字
比如我输入00000,12345678912345678912 现在它应该考虑 00000 并将其拆分为单个数字,如
token 1 =0,
token 2 =0,
token 3 =0,
token 4 =0,
token 5 =0,
在 COMMA 之后应该考虑 12345678912345678912 像
一样分裂token 1 =1234,
token 2 =5678,
token 3 =9123,
token 4 =4567,
token 5 =8912,
但它没有采用第二条规则并将其打印为逗号后的单个数字
任何人,请帮助
提前致谢
你几乎做对了。您犯的唯一错误是您想循环解析器规则而不是词法分析器规则。因此你的语法应该是这样的:
example: digit+ COMMA digit2+ NEWLINE ;
digit: INT ;
digit2: INT INT INT INT ;