当前位置: 首页 > 知识库问答 >
问题:

无法在非组合语法中为字符串文字创建隐式标记:

宋俊民
2023-03-14

这是我的XML解析器语法:

attribute   :   Name '=' STRING ;

和lexer:

STRING      :   '"' ~[<"]* '"'
            |   '\'' ~[<']* '\''
            ;

但是,当我使用以下命令检索C#代码中的STRING位时,这是有效的:

context.STRING().ToString();

我把文本用引号括起来,比如:“hello”,而不是hello。因此,我尝试将解析器语法更改为:

attribute   :   Name '=' '"' STRING ;

attribute   :   Name '="' STRING ;

我得到了错误:“无法在非组合语法中为字符串文字创建隐式标记”

我很困惑,为什么解析器语法中允许“=”而不是引号,以及如何更改解析器以检索没有引号的文本。而且,lexer似乎已经处理掉了引号,所以我不明白为什么在解析时仍然使用引号。

共有1个答案

丌官利
2023-03-14

如果您有单独的lexer和parser语法,当且仅当您在lexer中使用该字符串文字定义lexer规则时,您才允许在解析器中使用字符串文字。否则,lexer永远不会生成与该文字匹配的标记,因为lexer不知道哪些字符串文字出现或不出现在解析器中(组合语法不是这种情况,这就是错误消息显示“非组合语法”的原因)。

因此,您可以使用'=',但不能使用'"',因为您有规则EQUALS: '=';,但没有规则DQUOTE: '"';。但是在您继续添加这样的规则之前,让我们考虑一下它会做什么以及您是否想要这样(您不需要):

如果您添加了这样的规则(或使用了一种组合语法,您可以在不使用它的情况下使用它),则属性规则现在将匹配名称标记,后跟一个标记,后跟一个标记,后跟一个标记,后跟一个字符串标记。由于字符串标记的开头和结尾已经包含引号,因此看起来像这样:

SomeName   =    "   "hello"
 Name     '='  '"'  STRING

所以这不是你想要的。另外,即使这是你想要的,它也不会起作用:上面输入中的第一个引号不会被识别为'"'标记-而是"将被识别为字符串标记,然后hello作为Name,最后"作为'"标记(因为没有进一步的引用可以使其匹配STRING规则。

所以这是错误的方向,你不应该这样做。

如果您想要的是获取不带引号的字符串内容,解决方案不是在语法中添加更多引号。您应该在C#代码中使用Substring来删除字符串中的第一个和最后一个字符。

 类似资料:
  • 我已经将我的组合语法分解为两种Lexer和Parser语法: 组合语法非常简单,如: 然后我创建了一个FluentLexer。g4带有lexer规则和FluentParser。g4带有解析器规则。 然后我在FluentParser上导入了FluentLexer语法。 我尝试了两种选择: > 在Fluent Grammar中使用导入FluentLexer: 具有选项结构: <代码>选项{语言=Jav

  • 我有一个用盐散列加密密码的类。 但是,如果要向类传递null,则会出现以下错误: 当我使用类时,我得到错误:“不能隐式转换类型字符串到Byte[]”

  • 我在几乎所有的系统上都会看到“令牌语法错误,请删除这些令牌”。出来系统第一个实例后的println文本。出来普林顿。我不知道这意味着什么,也不知道如何解决?我是一个非常新的开始,所以这个代码中可能有多个错误。我还得到了“令牌上的语法错误”“Double is”“无效的AssignmentOperator”“和”“squared is”“,以及无效的AssignmentOperator”错误。这是一

  • 本文向大家介绍C语言创建字符串数组,包括了C语言创建字符串数组的使用技巧和注意事项,需要的朋友参考一下 例子 字符串数组可能意味着两件事: 元素为char *s的数组 其元素的数组的数组char小号 我们可以像这样创建一个字符指针数组: 请记住:当我们将字符串文字分配给时char *,字符串本身将分配在只读内存中。但是,该数组string_array分配在读/写内存中。这意味着我们可以修改数组中的

  • 问题内容: 根据guido(以及其他一些Python程序员)的说法,隐式字符串文字串联被认为是有害的。因此,我试图识别包含此类串联的逻辑行。 我的第一次(也是唯一的尝试)是使用; 我曾想过用来分割逻辑线,所以我将确定用引号引起来的部分,如果这些部分彼此相邻,则将其视为“文字级联”。 但是,这在多行字符串上失败,如以下示例所示: 我可以调整这是一些奇怪的临时方法,但是我想知道您是否可以想到一个简单的

  • 我有一个字符串“ECET”,我想创建所有可能的字符串,其中我用“X”替换一个或多个字母(除第一个外)。 在这种情况下,我的结果是: 关于如何处理这个问题有什么想法吗? 这不仅仅是创建“X”的可能组合/排列,还包括如何将它们与现有字符串组合。