我正在尝试为下面的命令定义语法.
object ParserWorkshop {
def main(args: Array[String]) = {
ChoiceParser("todo link todo to database")
ChoiceParser("todo link todo to database deadline: next tuesday context: app.model")
}
}
Run Code Online (Sandbox Code Playgroud)
第二个命令应该标记为:
action = todo
message = link todo to database
properties = [deadline: next tuesday, context: app.model]
Run Code Online (Sandbox Code Playgroud)
当我在下面定义的语法上运行此输入时,我收到以下错误消息:
[1.27] parsed: Command(todo,link todo to database,List())
[1.36] failure: string matching regex `\z' expected but `:' found
todo link todo to database deadline: next tuesday context: app.model
^
Run Code Online (Sandbox Code Playgroud)
据我所知,它失败了,因为匹配消息的单词的模式几乎与属性键的键的模式相同:值对,因此解析器无法分辨消息的结束位置和属性的开始.我可以通过坚持为每个属性使用开始令牌来解决这个问题,如下所示:
todo link todo to database :deadline: next tuesday …
Run Code Online (Sandbox Code Playgroud) 我有一个描述某种语言的yacc文件,我正在使用IMP(eclipse项目)开发一个编辑器.我使用LPG作为解析器生成器,所以我需要从我的yacc文件中提取BNF规则.我收到的yacc文件包含规则和操作.但是,我想只提取要在LPG中使用的语法描述的规则.一种方法是通过手动提取规则并将其重新格式化为BNF语法(或者可以编写程序将其转换为我想要的方式).我想知道是否有自动执行此操作的方法.我在一些博客中读到野牛可以提供帮助,但我无法找到合适的命令.有谁知道如何处理这个问题.
我不能真正发布我所拥有的yacc文件,因为它是保密的.但我可举个例子如下
argExprList:
assignExp
{
// some rules here
}
| assignExpList ',' assignExp
{
//some other rules here
}
;
Run Code Online (Sandbox Code Playgroud)
我希望它被转换成简单的样子
argExpList ::= assignExp|assignExpList ',' assignExp
Run Code Online (Sandbox Code Playgroud) 如果我给它一个BNF语法,我正在寻找能够构建解析器(在C#中)的工具(例如http://savage.net.au/SQL/sql-2003-2.bnf)
这样的发电机存在吗?
延伸巴克斯 - 诺尔形式:EBNF
我是解剖概念的新手.在哪里可以获得足够的易读性和遵循材料来编写boost :: spirit库的语法,它使用类似于EBNF的语法?
目前我正在研究维基百科的EBNF.
我正在使用ParseKit作为Objective-C,它采用类似BNF的语法来指定语法:
@start = command+;
command = new;
new = 'new' object ';';
object = 'house' | other;
Run Code Online (Sandbox Code Playgroud)
包含最后一行会导致错误.基本上我想说一个物体可以是房子或其他东西.非终端元素"其他"应该捕获那些不是房子的字.
我是否以错误的方式讨论"任何地方"的想法?
谢谢!
你知道在哪里可以得到最新版本的T-SQL的BNF(Backus Naur Form)表示法.这是微软版本,我找不到任何东西.我发现SQL2修订后的ISO标准在这里也被称为SQL92,但它似乎缺少微软的T-SQL的某些功能
如何使用正则表达式(或pyparsing更好?)来描述下面提供的脚本语言(Backus-Naur Form):
<root> := <tree> | <leaves>
<tree> := <group> [* <group>]
<group> := "{" <leaves> "}" | <leaf>;
<leaves> := {<leaf>;} leaf
<leaf> := <name> = <expression>{;}
<name> := <string_without_spaces_and_tabs>
<expression> := <string_without_spaces_and_tabs>
Run Code Online (Sandbox Code Playgroud)
脚本示例:
{
stage = 3;
some.param1 = [10, 20];
} *
{
stage = 4;
param3 = [100,150,200,250,300]
} *
endparam = [0, 1]
Run Code Online (Sandbox Code Playgroud)
我使用python re.compile并希望将所有内容分组,如下所示:
[ [ 'stage', '3'],
[ 'some.param1', '[10, 20]'] ],
[ ['stage', '4'],
['param3', '[100,150,200,250,300]'] ],
[ ['endparam', '[0, 1]'] ] …
Run Code Online (Sandbox Code Playgroud) 我已经在互联网上进行了广泛的搜索(现在至少有半天了),但似乎找不到所需的答案。
目前我正在尝试为.bnf-file
具有自定义语言支持的 IntelliJ 插件创建一个。
一些教程提到了{pin=1}
,{pin=2}
和的存在{recoverWhile=xyz}
,但我没有找到关于它们用途的任何真正解释,如果还有其他我应该知道的事情(也许 a{pin=3}
也存在?)。
那么有人可以告诉我这些标志、方法或它们的名称究竟是什么,以及如何在我的 .bnf 中使用它们吗?
谢谢你的帮助和最好的问候,Fuchs
我正在尝试向实现超文本咖啡壶控制协议(HTCPCP/1.0,在 RFC 2324 中定义)的服务器发送 BREW 请求,该协议是使用 cURL 构建在 HTTP 之上的协议。
我想煮一杯加奶油和一杯香草糖浆的咖啡,但到目前为止我的所有请求都被服务器拒绝了。
令人困惑的是,RFC 规定 Content-Type 必须设置为“application/coffee-pot-command”(第 2.11 节),但也规定 Content-Type 必须设置为“message/coffeepot”(第 4 节),另外还规定“message/coffeepot”的内容必须包含coffee-message-body,定义为coffee-message-body =“start”|“stop”)。我选择了“application/coffee-pot-command”,纯粹是把它放在第一位(但我两种都尝试过)。
接下来,我添加了一个“Accept-Additions”标题,将牛奶类型指定为“奶油”,将糖浆类型指定为“香草”。RFC 概述了此标头的 BNF:
Accept-Additions = "Accept-Additions" ":"
#( addition-range [ accept-params ] )
addition-type = ( "*"
| milk-type
| syrup-type
) *( ";" parameter )
milk-type = ( "Cream" | "Half-and-half" | "Whole-milk"
| "Part-Skim" | "Skim" | "Non-Dairy" )
syrup-type = ( "Vanilla" | "Almond" | "Raspberry"
| "Chocolate" )
Run Code Online (Sandbox Code Playgroud)
我对这部分的最佳猜测是我需要添加以下标头:
--header "Accept-Additions: Skim;1,Vanilla;1"
Run Code Online (Sandbox Code Playgroud)
虽然我没有解释 BNF …