Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Antlr4算术表示法_Antlr4 - Fatal编程技术网

Antlr4算术表示法

Antlr4算术表示法,antlr4,Antlr4,我正在解析一种类似SQL的语言,我需要能够处理此类表达式(仅限于示例): 这应该是两列的算术减法 SELECT child-name 这应该是列名“子名称” 我怎样才能做到这一点?在第一种情况下,您应该有4个令牌:选择子女数量-汽车数量 在第二种情况下,您应该只有两个:选择子名称 这可以通过仔细选择lexer规则来实现: SELECT: 'SELECT'; OP_SUB: '-'; ID: [a-zA-Z][a-zA-Z0-9_-]*; WS: [ \t\r\n]+ ->

我正在解析一种类似SQL的语言,我需要能够处理此类表达式(仅限于示例):

这应该是两列的算术减法

SELECT child-name
这应该是列名“子名称”


我怎样才能做到这一点?

在第一种情况下,您应该有4个令牌:
选择
子女数量
-
汽车数量

在第二种情况下,您应该只有两个:
选择
子名称

这可以通过仔细选择lexer规则来实现:

SELECT: 'SELECT';
OP_SUB: '-';
ID:     [a-zA-Z][a-zA-Z0-9_-]*;
WS:     [ \t\r\n]+ -> skip;

这些规则将在第一种情况下产生
SELECT
ID
OP\u SUB
ID
,在第二种情况下产生
SELECT
ID

ID
现在也将匹配
child------
。我会选择这样的方式:
ID:[a-zA-Z]([a-zA-Z0-9+)*
@Bart确实如此,但这不允许
abc--def
。也许
[a-zA-Z]('-'+[a-zA-Z0-9_]+)*
会起作用,但要由提问者定义语言规则。
SELECT: 'SELECT';
OP_SUB: '-';
ID:     [a-zA-Z][a-zA-Z0-9_-]*;
WS:     [ \t\r\n]+ -> skip;