Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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
ANTLR-gramar用于检测不明确的标记_Antlr_Grammar_Antlrworks - Fatal编程技术网

ANTLR-gramar用于检测不明确的标记

ANTLR-gramar用于检测不明确的标记,antlr,grammar,antlrworks,Antlr,Grammar,Antlrworks,我正在ANTLR中创建一个简单的语法来匹配某种命令。我一直使用使用特殊字符的代币 这些命令将与下列句子匹配 连接HAL计算机4 连接计算机8 连接HAL2⁸ 计算机16 连接HAL 9000计算机32 连接HAL\x0A25 | 32计算机64 。。。制作类似于: 很明显,我的问题出在ID令牌中,但我不知道如何解决它。以下是我目前的语法: grammar foo; ID : '"' ('\u0000'..'\uFFFF')+ '"' ; NUMBER : ('0'..'9'

我正在ANTLR中创建一个简单的语法来匹配某种命令。我一直使用使用特殊字符的代币

这些命令将与下列句子匹配

连接HAL计算机4 连接计算机8 连接HAL2⁸ 计算机16 连接HAL 9000计算机32 连接HAL\x0A25 | 32计算机64 。。。制作类似于:

很明显,我的问题出在ID令牌中,但我不知道如何解决它。以下是我目前的语法:

grammar foo;
ID      :   '"' ('\u0000'..'\uFFFF')+ '"' ;
NUMBER  :    ('0'..'9')* ;
SENTENCE    :    'connect ' ID ' computer' NUMBER ;

我该怎么做呢?

你的语法有几个问题:

数字匹配空字符串:lexer规则必须始终至少匹配1个字符 句子应该是语法分析器规则,请参见: “\u0000”…“\uFFFF”+还匹配一个“”,这可能是您不想要的 请尝试以下方法:

sentence   : K_CONNECT ID K_COMPUTER NUMBER;

K_CONNECT  : 'connect';
K_COMPUTER : 'computer';
ID         : '"' (~'"')+ '"';
NUMBER     : ('0'..'9')+;
SPACE      : (' ' | '\t' | '\r' | '\n')+ {skip();};

谢谢巴特,回答得很好。然而,你的第三个前提是错误的,也是我主要关心的问题之一。我还想匹配如下内容:connect HAL256 computer 8抱歉没有添加到问题中。@Alfre2,这听起来像是一场噩梦。这意味着整个输入中的第一个引号和最后一个引号可以是单个标记?这是您正在解析的现有语言吗?如果没有,你有发言权,我强烈建议你不要支持这样一个丑陋和令人困惑的代币。嗯。。。我会听从你的劝告,你帮了我很多。我从一个文本文件中获取这些命令,它们实际上可以包含引号之间的名称内的任何字符。我想在使用ANTLR解析器之前,我会对它们进行预处理,在这种情况下,您的解决方案会起作用。