Tag: antlr4

从任意纯文本中提取特定标记

我想解析纯文本注释并查找其中的某些标记。 我正在寻找的标签类型如下: 其中“name”是[az]字符串(来自固定列表),“1234”表示[0-9] +数字。 这些标记可以在字符串中出现零次或多次,并被任意其他文本包围。 例如,以下字符串都是有效的: “Hello world!” “!” “1 < 2” “++ and also.\n\nBy the way, maybe ” 以下字符串均无效: “1 < 2" "” “” “Hello ” 最后一个无效,因为“notinfixedlist”不是受支持的命名标识符。 我可以使用简单的正则表达式轻松解析它,例如(为简单起见,我省略了命名组): 或直接指定固定列表: 但是我想使用antlr有几个原因: 我想要任何与该格式不匹配的结果导致解析错误,因此如果文本包含“”但与模式不匹配,则失败。 必须将这些字符转义为“&lt;” 和“&gt;” 分别如果它不是标签。 我可能会在将来扩展它以支持其他类型的模式(例如:“{foo + 666}”或“[[@ 1234]]”并且希望避免爆发正则表达式语句。拥有单个语法文件我可以延伸会很棒。 我喜欢这样的事实:antlr4实现了访问者模式,当遇到特定类型的标记时我的代码被调用,而不是必须破解不同的正则表达式。 如何使用antlr4实现这样的语法? 我见过的大多数例子都是针对整个文本的精确规则的语言,而我只希望语法适用于任意文本中的匹配模式。 我想出了这个,我认为是正确的: grammar Tags; parse : ( tag | text )* ; tag : […]

如果输入无效,是否可以抛出exception?

我有一个简单的ANLTR语法和随附的访问者。 除非输入无效,否则一切都很好。 如果输入无效,则吞下错误并且我的计算器输出错误。 我已经尝试实现一个错误监听器,而不是使用词法分析器的Recover方法,以及……好吧……今天还有其他几十件事。 有人可以告诉我如何简单地抛出错误而不是吞下糟糕的“代币”吗? (我使用引号,因为它们根本不是标记。我的语法中的字符未定义。) 有效输入: 1 + 2 * 3 – 4 输入无效: 1 + 2 + 3(4) 如果解析器/词法分析器遇到括号(或任何其他未定义的字符),我想抛出ArgumentException 。 目前,无效字符似乎只是消失在以太中,解析器就像没有错一样。 如果我使用grun命令在控制台中运行它,我会得到以下输出,因此它会在某个级别识别无效的标记。 第1:9行令牌识别错误:’(’ 第1:11行令牌识别错误:’)’ 这导致解析树。 BasicMath.g4 grammar BasicMath; /* * Parser Rules */ compileUnit : expression+ EOF; expression : expression MULTIPLY expression #Multiplication | expression DIVIDE expression #Division | expression ADD expression #Addition […]

Antlr4 C#目标和生成文件的输出路径

我有一个带有Antlr3语法文件的C#解决方案,我正在尝试升级到Anltr4。 事实certificate语法是容易的部分(它变得更好,并且大小的三分之一!)。 生成解析器结果是棘手的部分。 在旧的解决方案中,我只是运行AntlrWorks来更新语法文件更改时的词法分析器和解析器.cs文件。 词法分析器和解析器直接包含在与语法相同的项目中,因此解析器周围的框架可以直接使用它们。 使用C#的Antlr4目标,我注意到(至少默认情况下)生成的Parser C#类的输出路径位于中间目录中,例如obj \ Debug。 这意味着我不能直接在同一个项目中使用解析器。 如果我希望生成的源可以在我的sln中使用,我是否应该更改输出路径? 我不希望它在我的sln? 我尝试为解析器生成创建一个单独的项目,即只包含语法文件的项目。 当使用Antlr4目标构建此项目时,可以从需要解析器类的项目中引用生成的程序集。 但是,如果这个项目包含在解决方案中,我仍然没有在visual studio中获得任何intellisense,因为它将intellisense基于加载项目的源文件,因此它仍然不太可用。 我能使其正常工作的唯一方法是构建然后卸载解析器项目,并让其他项目将其作为程序集文件而不是项目引用。 编辑: 在查看antlr-interest列表后,我发现这个线程表明intellisense的问题可能是Resharpers故障。 如果是这种情况,那么我的问题是如何在我的解决方案中继续使用Antlr4和Resharper? https://groups.google.com/forum/#!topic/antlr-discussion/QSuJXphaBDg

不匹配时lexing和解析模式时的输入

我有输入不匹配的ANTLR4问题,但无法解决。 我发现了很多关于它的问题,并且通常围绕词法分析器匹配其他东西到令牌,但我不认为它在我的情况下。 我有这个lexer语法: FieldStart : ‘[‘ Definition ‘]’ -> pushMode(INFIELD) ; Definition : ‘Element’; mode INFIELD; FieldEnd : ‘[end]’ -> popMode ; ContentValue : ~[[]* ; 然后在以下解析器上运行: field : FieldStart ContentValue FieldEnd #Field_Found; 我简化了它以放大问题,但这里是我无法进一步发展的地方。 我正在运行以下输入: [Element]Va-lu*e[end] 我得到这个输出: Type : 001 | FieldStart | [Element] Type : 004 | ContentValue | Va-lu*e Type : 003 | […]