【问题标题】:Capturing formatted variable declarations in ANTLR在 ANTLR 中捕获格式化的变量声明
【发布时间】:2013-09-09 23:59:41
【问题描述】:

我一直在研究一个简单的词法分析器/语法,但我无法理解匹配格式化变量的标准操作过程。我正在尝试匹配以下内容:

  1. 变量名称至少可以是 1 个字符。如果是一个字符,则必须是大写或小写字母。
  2. 如果大于 1 个字符,则必须以任意大小写的字母开头,后跟任意数量的字符,包括数字、下划线和美元符号。

我已经多次改写了这个,在很多方面,我总是得到以下错误:

Decision 可以使用多种选择匹配诸如“SINGLELETTER”之类的输入:1、2

因此,备选方案 2 已针对该输入禁用“

非常感谢一些见解。我知道我的语法有一些歧义,但我有点困惑,为什么可以匹配多个备选方案,一旦我们进入原始匹配循环。谢谢!

variablename 
    :   (SINGLELETTER)
    |   (SINGLELETTER|UNDERSCORE)( SINGLELETTER|UNDERSCORE | DOLLAR | NUMBER)*;

SINGLELETTER    :   ( 'a'..'z' | 'A'..'Z');


fragment LOWERCASE  :   'a'..'z';
fragment UNDERSCORE :   '_';
fragment DOLLAR :   '$';  
fragment NUMBER :   '0'..'9';

【问题讨论】:

    标签: antlr grammar lexer


    【解决方案1】:

    为什么不创建VariableName,一个为整个名称生成单个标记的词法分析器规则?

    Variablename 
        :   SINGLELETTER
        |   (SINGLELETTER|UNDERSCORE) (SINGLELETTER | UNDERSCORE | DOLLAR | NUMBER)*;
    
    fragment SINGLELETTER   :   ( 'a'..'z' | 'A'..'Z');
    
    
    fragment LOWERCASE  :   'a'..'z';
    fragment UNDERSCORE :   '_';
    fragment DOLLAR :   '$';  
    fragment NUMBER :   '0'..'9';
    

    此外,您编写variableName 的方式不遵循您编写的第2 点(语法允许变量以_ 开头,但您的解释中不允许这样做)。

    【讨论】:

    • 非常感谢您的回复。然而,这两个规则似乎与我写的完全相同,除了一个是词法分析器,一个是解析器规则。 “决策可以使用多个替代项匹配诸如“{'A'..'Z','a'..'z'}”之类的输入:1、2 因此,该输入的替代项 2 被禁用”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多