ANTLR 中的固定数字格式

发布于 2024-08-30 01:22:45 字数 182 浏览 5 评论 0原文

如何在antlr语法中指定固定位数?

我想解析包含固定字符数字段的行。每个字段都是一个数字。

0034|9056|4567|0987|-2340| +345|1000

上面的行是示例行。 |指示字段边界(不会出现在实际文件中。此处显示只是为了指示边界)。

字段可以包含空白字符 +/-

How to specify a fixed digit number in antlr grammar?

I want to parse a line which contains fields of fixed number of characters. Each field is a number.

0034|9056|4567|0987|-2340| +345|1000

The above line is a sample line. | indicates field boundaries (which will not be in the actual file. shown here just to indicate the boundary).

The fields can include blank characters +/-

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

在风中等你 2024-09-06 01:22:45

我会让词法分析器语法尽可能简单,只匹配零个或多个空格,后跟解析器语法中的可选符号,后跟数字。匹配后,检查(在解析器语法中)字段的“宽度”是否正确。

语法示例:

line
  :  field ('|' field)*
  ;

field
  :  Spaces? ('+' | '-')? Number // validate if 'field' is correct in this rule  
  ;

Number
  :  '0'..'9'+
  ;

Spaces
  :  ' '+
  ;

可能的验证方案可能如下所示:

line
  :  field ('|' field)*
  ;

field
@init{int length = 0;}
  :  (Spaces {length += $Spaces.text.length();})? 
     ('+' | '-')? Number {length += $Number.text.length(); if(length != 4) {/* do something */}}
  ;

Number
  :  '0'..'9'+
  ;

Spaces
  :  ' '+
  ;

I'd keep the lexer grammar as simple as possible and just match zero or more spaces followed by an optional sign followed by a number in your parser grammar. After matching that, check (in your parser grammar) if the "width" of the field is correct.

An example grammar:

line
  :  field ('|' field)*
  ;

field
  :  Spaces? ('+' | '-')? Number // validate if 'field' is correct in this rule  
  ;

Number
  :  '0'..'9'+
  ;

Spaces
  :  ' '+
  ;

And a possible validation scheme could look like:

line
  :  field ('|' field)*
  ;

field
@init{int length = 0;}
  :  (Spaces {length += $Spaces.text.length();})? 
     ('+' | '-')? Number {length += $Number.text.length(); if(length != 4) {/* do something */}}
  ;

Number
  :  '0'..'9'+
  ;

Spaces
  :  ' '+
  ;
墨小墨 2024-09-06 01:22:45

那么以下情况呢:

INT : ('+'|'-')? ('0'..'9')+;

What about the following:

INT : ('+'|'-')? ('0'..'9')+;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文