问题标签 [jparsec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Jparsec - 解析简单数字
这是一段简单的代码:
应该打印出一个数字,即 234234234。而是打印:
那么我错过了什么?
java - 解析简单字符串表达式中的 JParsec 错误
我的 java 应用程序需要一个解析器,所以我发现了 JParsec 库,并在他们的网站上使用简单的计算器语法浏览了一个教程。似乎我应该能够使用该库执行我计划的操作,因此开始制作原型,将示例计算器中的十进制文字解析更改为将非常简单的标识符解析为字符串。我现在唯一想做的操作是“+”,用于连接字符串,但我不断收到错误消息。这是我的代码:
以下是我遇到的错误:
知道我做错了什么吗?任何帮助是极大的赞赏!
java - jparsec中的混乱
我正在尝试使用 jparsec 来定义和利用我相当简单的语法,但我完全不知道如何去做。在这一点上我不知道是我对问题空间的理解不足,还是 jparsec 的稀疏和无信息文档。或两者。
我有一个语法是这样的:
所以你可以看到它支持诸如AND
, OR
, NOT
, IN
, =
,之类的运算符<>
。它还支持任意嵌套的括号来指示优先级。
我认为我在标记化方面已经取得了相当大的进展。这是我所拥有的:
test_tokenizer
通过,所以我认为它工作正常。
现在,我已经有了一个表示语法的类型层次结构。例如,我有名为Node
, BinaryNode
, FieldNode
,LogicalAndNode
等的类ConstantNode
。而我想要做的是创建一个Parser
接受我的令牌并吐出一个Node
. 这就是我一直卡住的地方。
我以为我会从像这样非常简单的事情开始:
我以为我可以做到这一点:
但这给了我一个编译错误:
所以看起来我的泛型在某个地方被scewed,但我不知道在哪里或如何解决这个问题。我什至不确定我是否会以正确的方式处理这件事。任何人都可以启发我吗?
java - JParsec 在简单测试中摔倒
我试图让最简单的解析器与 JParsec 2.0.1 一起工作,但我没有运气。我有以下 AST 课程:
以及以下测试代码:
即使我的词法分析器成功地将字符串输入解析为令牌,由于 JParsec 异常,我的解析器也无法使用这些令牌。我一遍又一遍地研究了这段代码,只能假设这是一个 jparsec 错误,或者我误解了一些明显的东西。
谁能告诉我我在这里做错了什么?
更新:我相信最初的问题是由于递归引用。我CONSTANT_PARSER
正在使用CONSTANT_LEXER
,然后我打电话给CONSTANT_PARSER.from(CONSTANT_LEXER...)
。通过将 my 更改CONSTANT_PARSER
为以下内容,我的测试通过了:
但是,这对我来说还没有完全成功。我怀疑有更好的方法可以做到这一点,所以我仍然对任何想法都非常感兴趣。
java - 使用 JParsec 解析括号中的文本
我正在为使用语法的 DSL 编写解析器(nodeHead: nodeBody)
。问题是nodeBody
在某些情况下可能包含括号。JParsec的between
operator 应该是一个很好的解决方案,但是下面的代码失败了:
ANY_CHAR
当我更改为时它不会失败IDENTIFIER
,所以我认为这里的问题是元组中的第二个解析器过于贪婪。或者,我可以让 JParsec 在应用正文之前应用解析器之间吗?
任何想法都非常受欢迎。
java - 如何使用带引号的字符解析分隔符分隔值并转义
我想用引号字符解析分隔符分隔的值并转义以进行引用。
例如:a, "b""c""", d
-> 预计削减为三列 ( a
), ( b"C"
), ( d
) 假设逗号作为分隔符,quote 既是引号字符又是转义字符。
我也想支持多个分隔符和封闭字符。
例如: -> 如果我们同时使用逗号和用作分隔符a, "b""c"""|d
,则预计将减少为三列。|
另一个例子: -> 如果我们同时使用逗号和分隔符,将左包围作为右包围并作为转义符,a, <b\<c\>>|d
则预期将解析为三列。|
<
>
\
是否可以使用 JParsec 创建解析器组合器?
在花了一些时间使用 API 之后,我希望下面的代码可以工作,但它无法按预期解析上面的示例。
请建议是否可以使用 JParsec,有没有更好的选择?
java - 在 Eclipse 中导入 JParsec
我从JParsec 下载部分下载了 .jar 文件和“源代码和文档”压缩包。不知何故,我无法使用 Eclipse IDE 导入 JParsec 源代码(也找不到任何文档)。有人可以解释如何导入它吗?非常感谢!
java - 如何在 JParsec(3) 中获取匹配输入的位置?
我正在使用 JParsec3 创建一个 DSL。解析/链接分两个阶段完成:
- 将语言解析为中间对象
- 链接对象并将其转换为可执行对象
在第 1 阶段创建的对象可以引用其他尚未解析的对象,因此需要 2 次。现在,对于链接错误消息,我需要将用户发送到文件中他们引用不存在的项目的位置。为此,我需要将位置附加到中间对象。
我怎么做?
谢谢!
java - 使用 jparsec 解析负数
使用 jparsec,我正在尝试解析可能为负数或非负数的数字:
我一直无法弄清楚如何声明PARSER
. 我试过了:
这不起作用,因为Terminals.IntegerLiteral.TOKENIZER
不包含减号。接下来,我尝试了:
这也不起作用,因为负号被丢弃并且我的地图函数永远不会看到它。
谁能告诉我如何使用 jparsec 正确解析可能为正数或非正数的整数?
编辑:我找到了一种方法,但我很难相信这是最好的方法:
java - 为什么 Terminals.tokenizer() 标记未注册的运算符/关键字?
我刚刚发现了我观察到的一些非常令人困惑的行为的根本原因。这是一个测试:
这输出:
我期待返回的解析器terminals.tokenizer()
不返回任何内容,因为“d”不是有效的关键字或运算符。
我关心的原因是因为我希望我自己的解析器的优先级低于返回的优先级terminals.tokenizer()
:
以上IDENTIFIER_TOKENIZER
从未使用过,因为TERMINALS.tokenizer()
总是匹配。
为什么要Terminals.tokenizer()
标记未注册的运算符/关键字?我该如何解决这个问题?