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

不能使用“。”作为antlr4中的分隔符

汲丰茂
2023-03-14

我正在编写一个解析器来解析字符串,比如aaa.bb=“ccc@ddd.com”

antlr4语法文件如下所示:

    DOT : [\-\_\.\@\>]+ ; 
    fragment CHAR: [a-zA-Z_0-9];
    fragment CHAR2:[\-\_\.\@];
    DECIMAL : '-'?[0-9]+('.'[0-9]+)? ;
    ATTR_ID : CHAR+;
    VALUE_ID: ATTR_ID+ (CHAR2? ATTR_ID)*;
    attribute
    :
    (attrGroup DOT attrKey) | attrKey;
    value :  DECIMAL | VALUE_ID | DATE;
attrGroup: aaa
attrKey: bbb

如果我把value_iddef加回来,就会出现错误:

属性:1:0:不匹配
输入“aaa.bb”应为ATTR_ID

注意:如果输入字符串为:aaa>bbb=“ccc@ddd.com”则可以工作

共有1个答案

浦修文
2023-03-14

我建议对valueID使用解析器规则。这将允许lexer匹配ATTR_ID,但随后确定令牌应该形成value_id

DECIMAL : '-'?[0-9]+('.'[0-9]+)? ;
DOT : [\-\_\.\@\>]+ ;
ATTR_ID : [a-zA-Z0-9]+;


value_id: ATTR_ID+ (DOT? ATTR_ID)*;
 类似资料:
  • 如果使用带有单个参数的第一个StringToknenizer构造函数并编写示例程序,结果是和12个令牌。它返回没有任何空格的整个句子。我明白这是怎么回事。 如果使用带有两个参数的第二个构造函数,我的测试程序将得到每个单词有空格,但没有逗号,只有两个标记。我认为它应该同时将空格和逗号作为标记分隔符计算,但它将逗号之前的所有内容作为1标记计算,将逗号之后的所有内容作为1标记计算。这部分让我很困惑。 我

  • 问题内容: 我需要创建一个逗号分隔的项目列表: 根据AngularJS文档,表达式中不允许使用控制流语句。这就是为什么我无法正常工作的原因。 有没有其他方法可以创建逗号分隔的列表? 编辑1 比以下更简单: 问题答案: 您可以这样进行: ..但我喜欢Philipp的回答:-)

  • 我试图让一些sql关键字作为标识符被接受,当用作标识符时。Antlr的书p210提出了这个技巧: 我也有类似的东西,但它不起作用,我想这是我的误解。是标识符的解析规则,因此: 是ident的主要lex规则。大致是这样的(这里简化了),它起作用了: 如果我给它作为输入('aaa'不是关键字),它将解析: 但是如果我给它,它就会失败--'sparse'是一个关键字: 也许我很笨,但我不明白为什么,因为

  • 问题内容: 我正在尝试在Java Web应用程序中使用StringTemplate生成HTML电子邮件。当尝试输入换行符时,我使用“ 这似乎不起作用”。 效果不佳。有没有办法关闭<和>作为定界符,以便我可以测试这是否是问题所在?整个StringTemplate文档都说使用$ … $作为分隔符,但没有说明如何不使用<…> 问题答案: 创建组时,可以使用以下命令设置分隔符 其中“ $”和“ $”是您的