给定语法的ANTLR代码

时间:2016-09-25 09:40:28

标签: antlr antlr4 antlrworks

我试图为下面的语法编写ANTLR代码。我是ANTLR的新手。有人可以帮助我。我环顾四周,只能找到与基本计算相关的教程,如加法,减法等。

PRINT a + b应打印一个+ b表达式并打印"这是测试"应该打印这是测试。 应接受INTEGER a,b。我可以为INTEGER a做,但不能同时为多个INTEGER做。

1 个答案:

答案 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]*)