我正在寻找一个很好的解析器生成器,我可以用它来读取我们的大型商业应用程序中的自定义文本文件格式.目前,这种特殊的文件格式是使用手工递归解析器读取的,但格式已经增长并且复杂化到这种方法变得无法管理的程度.
似乎最终的解决方案是为这种格式构建一个正确的语法,然后使用像yacc这样的真正的解析器生成器来读取它,但我无法确定使用哪个这样的生成器,或者即使它们值得麻烦一点都不 我看过ANTLR和Spirit,但我们的项目除了早期的答案之外还有特定的限制因素让我想知道它们是否适合我们.特别是,我需要:
我喜欢ANTLRworks的IDE和调试工具,但看起来让它的C目标实际上与我们的应用程序一起工作将是一项艰巨的任务.在开始这个问题之前,ANTLR是否适合这项工作?
有问题的文字格式如下:
attribute "FluxCapacitance" real constant
asset DeLorean
{
//comment foo bar baz
model "delorean.mdl"
animation "gullwing.anm"
references "Marty"
loadonce
}
template TimeMachine
{
attribute FluxCapacitance 10
asset DeLorean
}
Run Code Online (Sandbox Code Playgroud) 我想知道:有没有像PHP的pyparsing(递归下降解析器)?
我已经找了它,但似乎没有人做过.我希望我错了.
先感谢您.
我正在编写一个非常基本的Web服务器,它必须支持极其有限的特殊服务器端脚本语言.基本上我需要支持的是"echo",加/减/乘(没有除法)只有2个操作数,一个简单的"date()"函数输出日期和使用"&"运算符来连接字符串.
一个例子可能是:
echo "Here is the date: " & date();
echo "9 x 15 = : & 9*15;
Run Code Online (Sandbox Code Playgroud)
我已经完成并创建了生成令牌所需的代码,但我不确定我是否使用了正确的令牌.
我为以下内容创建了令牌:
ECHO - The echo command
WHITESPACE - Any whitespace
STRING - A string inside quotations
DATE - The date() function
CONCAT - the & operator for concatenation
MATH - Any instance of binary operation (5+4, 9*2, 8-2, etc)
TERM - The terminal character (;)
Run Code Online (Sandbox Code Playgroud)
MATH我特别不确定.通常我看到人们专门为整数创建一个令牌,然后为每个运算符创建一个令牌,但由于我只想允许二进制操作,我认为将它组合成一个令牌是有意义的.如果我要分开做所有事情,我将不得不做一些额外的工作,以确保我从未接受过"5 + 4 + 1".
问题1是我在正确的轨道上使用哪些令牌?
我的下一个问题是如何使用这些令牌来确保正确的语法?我想到的方法基本上是说,"好吧,我知道我有这个令牌,这里有一个基于当前令牌允许接下来的令牌列表.列表中的下一个令牌是什么?"
基于此,我列出了所有令牌以及令牌有效直接出现在它们之后(为简单起见,不包括空格).
ECHO -> STRING|MATH|DATE
STRING -> TERM|CONCAT
MATH -> …
Run Code Online (Sandbox Code Playgroud) 给定一个字符串:
var str1 = "25*5+5*7";
Run Code Online (Sandbox Code Playgroud)
如果不使用eval
JavaScript中的构造函数,我怎样才能编写一个名为"output"的函数,该函数接收字符串并输出字符串的算术值,在本例中为160?
我正在构建一个应用程序,它具有在配置 yaml 文件中嵌入表达式/规则的功能。因此,例如用户可以引用在 yaml 文件中定义的变量,如${variables.name == 'John'}
或${is_equal(variables.name, 'John')}
。我可能可以使用简单的表达式,但我想支持复杂的规则/表达式,例如${variables.name == 'John'} and (${variables.age > 18} OR ${variables.adult == true})
我正在寻找一个解析/dsl/rules-engine 库,它可以支持这些类型的表达式并对其进行规范化。如果有人知道该语言的库,我会使用 ruby、javascript、java 或 python 打开。
我想到的一种选择是只支持 javascript 作为条件/规则,并基本上通过 eval 使用正确的上下文设置来访问变量和其他可引用的变量。
关于如何编写递归下降解析器,我有两个问题:
第一个是什么时候你有一个非终结者可以匹配几个不同的非终结者之一?你如何检查哪种方式是正确的?
第二,你如何建立AST?使用YACC,我可以编写一段代码来执行非终结符的每个实例,并且它具有引用规则"值"的特殊变量.你如何在递归下降解析器中做类似的事情?
我正在学习如何编写标记器,解析器以及作为练习我正在用JavaScript编写计算器.
我正在使用一种prase树方法(我希望我的这个术语正确)来构建我的计算器.我正在根据运算符优先级构建一个令牌树.
例如,给定一个表达式a*b+c*(d*(g-f))
,正确的树将是:
+
/ \
* \
/ \ \
a b \
*
/ \
c *
/ \
d -
/ \
g f
Run Code Online (Sandbox Code Playgroud)
一旦我拥有树,我就可以遍历它并递归地在左右节点的每个根节点上应用操作以找到表达式的值.
然而,最大的问题是实际构建这棵树.我只是无法弄清楚如何正确地做到这一点.我不能只拆分运营商+
,-
,/
和*
和,因为优先的左侧和右侧部分创建树.
到目前为止我所做的是将表达式标记化.所以a*b+c*(d*(g-f))
,我给出了一系列令牌:
[a, Operator*, b, Operator+, c, Operator*, OpenParen, d, Operator*, OpenParen, g, Operator-, f, CloseParen, CloseParen]
Run Code Online (Sandbox Code Playgroud)
但是我无法弄清楚如何从这个令牌数组转到我可以遍历并找出值的树的下一步.任何人都可以帮我提出如何做到这一点的想法吗?
所以我要说我有以下语法:
let_stat = "let" iden [ "=" expr ];
if_stat = "if" expr "->" stat;
stat = let_stat | if_stat;
Run Code Online (Sandbox Code Playgroud)
这将是以下psuedo-ish代码:
let_stat parseLetStat() {
if token is "let" {
consume token
if token is identifier {
char *value = consumetoken.value
let_stat let = new let_stat;
let.name = value;
if token is "=" {
let.value = parseExpression;
}
return let
}
}
}
if_stat parseIfStat() {
if token is "if" {
consume token
expression expr = parseExpression;
block block = parseBlock; …
Run Code Online (Sandbox Code Playgroud) 我有一个传入的记录过滤器与逻辑子句一起存储,如下所示.
Acct1 = 'Y' AND Acct2 = 'N' AND Acct3 = 'N' AND Acct4 = 'N' AND Acct5 = 'N' AND ((Acct6 = 'N' OR Acct7 = 'N' AND Acct1 = 'Y') AND Formatted= 'N' AND Acct9 = 'N' AND (Acct10 = 'N' AND Acct11 = 'N') AND EditableField= 'N' )
Run Code Online (Sandbox Code Playgroud)
我输入此子句的数据将来自Csv文件,如下所示.
Country,Type,Usage,Acct1,Acct2,Acct3,Acct4,Acct5,Acct6,Acct7,Formatted,Acct9,Acct10,Acct11,EditableField
USA,Premium,Corporate,Y,N,Y,N,N,N,Y,N,Y,N,Y,N,
Mexico,Premium,Corporate,Y,N,Y,N,Y,N,Y,N,Y,N,Y,N,
USA,Premium,Corporate,Y,N,Y,N,N,N,N,Y,Y,N,Y,N,
USA,Premium,Corporate,Y,N,Y,N,Y,N,Y,Y,Y,N,Y,N,
Run Code Online (Sandbox Code Playgroud)
我将不得不根据条款中定义的条件过滤掉文件中的记录.这是一个简单子句的示例,但是会有比这更多的内部条件,并且只要用户需要就可以更改子句,并且记录必须按顺序传递10个这样的子句.
所以我正在寻找一种动态解释该子句并将其应用于传入记录的方法.请提供您有关如何设计/任何示例(如果有)的建议.
我知道我的问题听起来有点模糊,但我在网上找不到任何教程。我不是在寻求答案,而是在寻求更多解释。\nBNF 的示例:
\n\n<prog> ::= \xe2\x80\x9cint main() { <stat_list> return 0; }\xe2\x80\x9d\n<stat_list> ::= <stat>\n | <stat_list> <stat>\n<stat> ::= <cmpd_stat>\n | <if_stat>\n | <iter_stat>\n | <assgn_stat>\n | <decl_stat>\n<cmpd_stat> ::= { <stat_list> }\n<if_stat> ::= if ( <exp> ) <stat>\n | if ( <exp> ) <cmpd_stat>\n | if ( <exp> ) <stat> else <stat>\n | if ( <exp> ) <cmpd_stat> else <stat>\n | if ( <exp> ) <stat> else <cmpd_stat>\n | if ( <exp> ) <cmpd_stat> else <cmpd_stat>\n
Run Code Online (Sandbox Code Playgroud)\n\n将其转换为 python 以使我的程序使用上述条件创建随机程序的最简单方法是什么?任何有用网站链接的帮助将不胜感激。
\n