给定语法的 ANTLR 代码
ANTLR code for given grammar
我正在尝试为以下语法编写 ANTLR 代码。我对 ANTLR 很陌生。有人可以帮助我吗?我环顾四周,只能找到与加法、减法等基本计算相关的教程
PRINT a+b 应该打印 a+b 表达式,PRINT "This is test" 应该打印 This is test 。
INTEGER a,b 应该被接受。我可以为 INTEGER a 做,但一次不能为多个 INTEGER 做。
也许您可以使用以下语法作为起点
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]+);
的整数。将范围表示为仅接受语法内落入该范围内的值的正则表达式并不是一个好主意。最好在处理值的程序中执行此操作。否则,你最终会得到这样的结果 ;-):
(-[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]*)
我正在尝试为以下语法编写 ANTLR 代码。我对 ANTLR 很陌生。有人可以帮助我吗?我环顾四周,只能找到与加法、减法等基本计算相关的教程
PRINT a+b 应该打印 a+b 表达式,PRINT "This is test" 应该打印 This is test 。 INTEGER a,b 应该被接受。我可以为 INTEGER a 做,但一次不能为多个 INTEGER 做。
也许您可以使用以下语法作为起点
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]+);
的整数。将范围表示为仅接受语法内落入该范围内的值的正则表达式并不是一个好主意。最好在处理值的程序中执行此操作。否则,你最终会得到这样的结果 ;-):
(-[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]*)