这是一种用 ANTLR 拆分字符的方法吗?
Is it a way to split chars with ANTLR?
我正在尝试将 ANTLR 翻译器从 Markdown 格式转换为 HTML 文档,当我尝试识别粗体格式时发现了这个问题。这是我的 ANTLR 规则:
TxtNegrita : ('**' | '__') .*? ('**' | '__') {System.out.println('<span class="bold">' + getText() + '</span>');};
不幸的是,getText()
函数检索所有已识别的字符串,包括字符串开头和结尾的 **
。这是一种使用 ANTLR 删除字符的方法吗(显然,在 Java 中是完全可能的)。
谢谢!
您已经创建了一个 Lexer 规则,它产生了一个标记。这是预期的行为。
该规则看起来更像我期望的解析器规则。
(规则以大写字符开头(通常全部大写以使它们脱颖而出),解析器规则以小写字母开头并生成解析树,其中每个节点都有一个上下文,使您可以访问你的解析器规则。
在 ANTLR 中,了解 Lexer 规则和解析器规则之间的区别非常重要。
简单地说...您的输入字符流使用 Lexer 规则转换为输入标记流,并且该标记流由解析器规则处理。
令牌几乎是解析器规则处理的“原子”,它们的值只是与 Lexer 规则匹配的字符串。
我正在尝试将 ANTLR 翻译器从 Markdown 格式转换为 HTML 文档,当我尝试识别粗体格式时发现了这个问题。这是我的 ANTLR 规则:
TxtNegrita : ('**' | '__') .*? ('**' | '__') {System.out.println('<span class="bold">' + getText() + '</span>');};
不幸的是,getText()
函数检索所有已识别的字符串,包括字符串开头和结尾的 **
。这是一种使用 ANTLR 删除字符的方法吗(显然,在 Java 中是完全可能的)。
谢谢!
您已经创建了一个 Lexer 规则,它产生了一个标记。这是预期的行为。
该规则看起来更像我期望的解析器规则。
(规则以大写字符开头(通常全部大写以使它们脱颖而出),解析器规则以小写字母开头并生成解析树,其中每个节点都有一个上下文,使您可以访问你的解析器规则。
在 ANTLR 中,了解 Lexer 规则和解析器规则之间的区别非常重要。
简单地说...您的输入字符流使用 Lexer 规则转换为输入标记流,并且该标记流由解析器规则处理。
令牌几乎是解析器规则处理的“原子”,它们的值只是与 Lexer 规则匹配的字符串。