我试图为以下语法编写ANTLR代码。我是新来的。有人能帮帮我吗?我环顾四周,只能找到与基本计算相关的教程,如加法,减法等。
PRINT a+b应该打印a+b表达式,PRINT "This is test"应该打印This is test。应该接受整数a,b。
也许您可以使用以下语法作为起点
grammar Simple;
Opname: [a-zA-Z]+[_a-zA-ZA0-9]*;
Operation: '+' | '-';
Datatype: 'INTEGER';
String : '"' (~('"') | '\"')* '"' | ''' (~(''') | '\'')* ''' ;
s: (print | sequence)* EOF;
print: 'PRINT' (expression | string);
string: String;
expression: Opname Operation Opname;
parlist: Opname (',' Opname)*;
sequence: Datatype parlist;
WS : [ trn]+ -> skip;
您可以钩入一个简单的解析树侦听器来收集表达式或字符串。
关于整数范围:我不会对语法中的范围进行有效性检查——在语法中,我只会确保提供的值是带有Number: '-'? ([0-9]|[1-9][0-9]+);
之类的int。将范围表示为正则表达式,而正则表达式只接受语法中属于该范围的值,这不是一个好主意。最好在处理这些值的程序中执行此操作。否则,就会得到这样的结果;-):
(-[0-1][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|-20[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|-21[0-3][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|-214[0-6][0-9][0-9][0-9][0-9][0-9][0-9]|-2147[0-3][0-9][0-9][0-9][0-9][0-9]|-21474[0-7][0-9][0-9][0-9][0-9]|-214748[0-2][0-9][0-9][0-9]|-2147483[0-5][0-9][0-9]|-21474836[0-3][0-9]|-214748364[0-2]|-[1-9][0-9]{0,8}|-[1-9][0-9]{0,8}|-[1-9][0-9]{0,8}|-[1-9][0-9]{0,8}|-[1-9][0-9]{0,8}|-[1-9][0-9]{0,8}|-[1-9][0-9]{0,8}|-[1-9][0-9]{0,8}|-[1-9][0-9]{0,8}|-[1-9][0-9]{0,8}|[0-9]|[1-9][0-9]*)&([0-1][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|20[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|21[0-3][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|214[0-6][0-9][0-9][0-9][0-9][0-9][0-9]|2147[0-3][0-9][0-9][0-9][0-9][0-9]|21474[0-7][0-9][0-9][0-9][0-9]|214748[0-2][0-9][0-9][0-9]|2147483[0-5][0-9][0-9]|21474836[0-3][0-9]|214748364[0-2]|[1-9][0-9]{0,8}|[1-9][0-9]{0,8}|[1-9][0-9]{0,8}|[1-9][0-9]{0,8}|[1-9][0-9]{0,8}|[1-9][0-9]{0,8}|[1-9][0-9]{0,8}|[1-9][0-9]{0,8}|[1-9][0-9]{0,8}|[1-9][0-9]{0,8}|0|-[1-9][0-9]*)