【问题标题】:Making some parser rules case-insensitive in antlr在 antlr 中使一些解析器规则不区分大小写
【发布时间】:2012-07-07 12:34:30
【问题描述】:

我正在编写一个小型 csharp 控制台应用程序,它从控制台读取文本,进行一些操作并返回一个字符串。为此,我正在使用 Antlr。语法文件如下所示。

    grammar test;
options {

  language = CSharp2;
  output = AST;
}
start returns [String res]: expression EOF
{ 
$res=$expression.res;  
} ;

expression returns [String res]
: Identifier  {$res=$Identifier.text}
|Num {$res=$num.text;
|function {$res=function.res}
;

function: 'left'  '( Identifier ')'{some code here}
        | 'right' '( Identifier ')'{some code here}
        |..........
         ;
Num : (Minus)?('0'..'9')+   ;
Identifier  :  ('a'..'z'|'A'..'Z'|'\\'|'/'|'_'|':'|';'|'?'|'.'|'0'..'9')('a'..'z'|'A'..'Z'|'\\'|'/'|'_'|':'|';'|'.'|'?'|'0'..'9')*; 

我有几个这样的函数可以进行一些字符串操作。现在,我希望 Antlr 能够不分大小写地识别这些函数名称。目前,它只接受小写字母作为函数名,如..upper(asdf)。我无法在我的应用程序中将每个标记都转换为小写,因为它也会更改标识符的大小写。我怎样才能做到这一点?

【问题讨论】:

    标签: antlr antlr3


    【解决方案1】:

    只需定义适当的标记。所以,对于上面的代码:

    function : Left  '(' Identifier ')' {some code here}
             | ..........
             ;
    
    Left : ('l'|'L')('e'|'E')('f'|'F')('t'|'T');
    

    或者,如果您确定想要lEfT 之类的案例:

    function : Left  '(' Identifier ')' {some code here}
             | ..........
             ;
    
    Left : ('left'|'LEFT');
    

    【讨论】:

    • 你是对的,因此我删除了你答案的“猜测”部分。
    • 好的,谢谢(我想知道是否使用正则表达式定义了标记,该正则表达式可能具有“无大小写”标志,但在搜索中没有出现任何内容)。
    • ANTLR 2 有该选项(不区分大小写的词法分析器匹配),但 ANTLR 3 没有。
    • 我有大约 30 个函数。我必须分别为每个函数定义大写字母和小写字母.. 正确吗?
    • 是的,Bart 的评论证实了这一点(好吧,显然编写一个小程序来为您完成这项工作会更简单)。
    【解决方案2】:

    The standard way 表示不区分大小写

    LEFT : [Ll] [Ee] [Ff] [Tt];
    

    如果所有规则都不区分大小写,那么

    1. 使用仅小写

    2. 创建您的语法
    3. 在将要编译的字符串传递给词法分析器之前,使字符串小写

    【讨论】:

      【解决方案3】:

      你可以使用 选项 { 区分大小写=假 } 维护一个不区分大小写的词法分析器

      【讨论】:

      • 错误illegal option caseSensitive
      • 从即将发布的 4.9.4 开始,我们将支持 caseInsensitive 选项
      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2012-03-04
      相关资源
      最近更新 更多