这是我的XML解析器语法:
attribute : Name '=' STRING ;
和lexer:
STRING : '"' ~[<"]* '"'
| '\'' ~[<']* '\''
;
但是,当我使用以下命令检索C#代码中的STRING位时,这是有效的:
context.STRING().ToString();
我把文本用引号括起来,比如:“hello”,而不是hello。因此,我尝试将解析器语法更改为:
attribute : Name '=' '"' STRING ;
或
attribute : Name '="' STRING ;
我得到了错误:“无法在非组合语法中为字符串文字创建隐式标记”
我很困惑,为什么解析器语法中允许“=”而不是引号,以及如何更改解析器以检索没有引号的文本。而且,lexer似乎已经处理掉了引号,所以我不明白为什么在解析时仍然使用引号。
如果您有单独的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”的可能组合/排列,还包括如何将它们与现有字符串组合。