c# - 替换 ANTLR 中标记的文本

标签 c# antlr lexer

我正在尝试将输入程序中的某些标记文本替换为特定格式的文本。我使用 C# 作为输出语言。

输入示例:

time#1m2s

该输入的 lex 语法:

fragment
DIGIT : '0'..'9'
      ;

CTE_DURATION 
    : ('T'|'t'|'TIME'|'time') '#' '-'? (DIGIT ('d'|'h'|'m'|'s'|'ms') '_'?)+
    ;

我想从输入示例中获取的输出标记文本:

0.0:1:2.0

这意味着:0 天、0 小时、1 分钟、2 秒和 0 毫秒。

有什么建议吗?预先感谢您。

最佳答案

这里有一种方法可以做到这一点(它是用 Java 编写的,但移植到 C# 应该不难):

grammar Test;

parse
 : CTE_DURATION EOF
 ;

CTE_DURATION 
 : ('T' 'IME'? | 't' 'ime'?) '#' minus='-'?
   (d=DIGITS 'd')? (h=DIGITS 'h')? (m=DIGITS 'm')? (s=DIGITS 's')? (ms=DIGITS 'ms')?
   {
     int days = $d == null ? 0 : Integer.valueOf($d.text);
     int hours = $h == null ? 0 : Integer.valueOf($h.text);
     int minutes = $m == null ? 0 : Integer.valueOf($m.text);
     int seconds = $s == null ? 0 : Integer.valueOf($s.text);
     int mseconds = $ms == null ? 0 : Integer.valueOf($ms.text);
     setText(($minus == null ? "" : "-") + days + "." + hours + ":" + minutes + ":" + seconds + "." + mseconds);
   }
 ;

fragment DIGITS : '0'..'9'+;

解析输入 time#1m2s 会产生以下解析树:

enter image description here

请注意,语法现在也接受 time# (导致它生成 0.0:0:0.0),但您可以轻松地从词法分析器规则中生成异常如果这样的输入无效。

关于c# - 替换 ANTLR 中标记的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314104/

相关文章:

c# - GridView RowDataBound 处理程序 - 无法从行中获取数据

c# - 关于dataGridView的Row和Column Headers的问题

c# - 从 Windows API 返回的消息

c - antlr 为 c 生成 ast 并解析 ast

antlr - 帮助对语法进行左分解以消除左递归

c# - C# 是否有(直接)flex/yacc 端口?或者人们为 C# 使用什么词法分析器/解析器?

c++ - Flex Lexer 工具中的类 istream

c# - 超过100位玩家在线时套接字失败

jvm - 创建一个简单的领域特定语言

parsing - Boost Spirit是否可以处理类似Postscript/PDF的语言?