我试图为下面的语法编写ANTLR代码。我是ANTLR的新手。有人可以帮助我。我环顾四周,只能找到与基本计算相关的教程,如加法,减法等。
PRINT a + b应打印一个+ b表达式并打印"这是测试"应该打印这是测试。 应接受INTEGER a,b。我可以为INTEGER a做,但不能同时为多个INTEGER做。
答案 0 :(得分:-1)
也许您可以使用以下语法作为起点
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 : [ \t\r\n]+ -> 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]*)