关于如何编写递归下降解析器,我有两个问题:
第一个是什么时候你有一个非终结者可以匹配几个不同的非终结者之一?你如何检查哪种方式是正确的?
第二,你如何建立AST?使用YACC,我可以编写一段代码来执行非终结符的每个实例,并且它具有引用规则"值"的特殊变量.你如何在递归下降解析器中做类似的事情?
我试图在PHP中为以下EBNF编写一个递归下降解析器:
EXP ::= < TERM > { ( + | - ) < TERM > }
TERM ::= < FACTOR > { ( * | / ) < FACTOR > }
FACTOR ::= ( < EXP > ) | < DIGIT >
DIGIT ::= 0 | 1 | 2 | 3
Run Code Online (Sandbox Code Playgroud)
我按照这个指南,我看到推荐的类似问题.(我发布之前搜索过)
在大多数情况下,我了解它是如何工作的,我理解语法.我认为问题在于我的语法.我是PHP的新手,所以我一直在引用W3Schools.我目前使用我的代码收到以下错误:
Warning: Wrong parameter count for exp() .... on line 101
Run Code Online (Sandbox Code Playgroud)
我试图查找这个错误并没有太多运气.我读了一些关于传入错误参数的人的帖子,但我没有为该函数设置任何参数.我有什么关于PHP的东西吗?
下面是我的代码,我认为逻辑是正确的,因为我基于语法的解析树.$ input将来自HTML页面上的表单框.当我发现PHP4没有内置时,我也从不同的帖子中获取了str_split函数.
<html>
<body>
<?php
if(!function_exists("exp")){
function exp(){
term();
while($token == "+" …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个这样的子句.
所以我正在寻找一种动态解释该子句并将其应用于传入记录的方法.请提供您有关如何设计/任何示例(如果有)的建议.
我想知道语法分析和语义分析是如何工作的。
我已经完成了词法分析器和解释器的语法构建。
现在我将为这个语法实现一个递归下降(自上而下)解析器
例如,我有以下语法:
<declaration> ::= <data_type> <identifier> ASSIGN <value>
Run Code Online (Sandbox Code Playgroud)
所以我这样编码(用java):
public void declaration(){
data_type();
identifier();
if(token.equals("ASSIGN")){
lexer(); //calls next token
value();
} else {
error();
}
}
Run Code Online (Sandbox Code Playgroud)
假设我有三种数据类型:Int、String 和 Boolean。由于每种数据类型的值不同(例如仅布尔值中的 true 或 false),我如何确定它是否正确适合数据类型?我的代码的哪一部分将决定这一点?
我想知道我应该把代码放在哪里:
1.) call the semantic analysis part of my program.
2.) store my variables into the symbol table.
Run Code Online (Sandbox Code Playgroud)
语法分析和语义分析是同时进行的吗?还是我需要先完成语法分析,然后再进行语义分析?
我真的很困惑。请帮忙。
谢谢。
compiler-construction syntax parsing recursive-descent semantics
我一直在尝试找到一种也适合回溯缩进的递归下降解析器算法。但我一直让自己为此寻找麻烦的解决方案。
是否有任何资源也可以处理缩进?
谢谢
作为真实语言解析器的简化子问题,我试图为虚构语言的表达式实现一个解析器,它看起来类似于标准命令式语言(如Python,JavaScript等).其语法具有以下构造:
[a-zA-Z]+)+和*和括号的算术表达式.(例如foo.bar.buz)(1, foo, bar.buz))(删除歧义一元组写成(x,))foo(1, bar, buz()))foo()(),因为foo()可能返回函数是合法的)所以这个语言中的一个相当复杂的程序是
(1+2*3, f(4,5,6)(bar) + qux.quux()().quuux)
Run Code Online (Sandbox Code Playgroud)
相关性应该是
( (1+(2*3)), ( ((f(4,5,6))(bar)) + ((((qux.quux)())()).quuux) ) )
Run Code Online (Sandbox Code Playgroud)
我目前正在使用非常好的uu-parsinglib应用解析器组合器库.
第一个问题显然是直观的表达式语法(expr -> identifier | number | expr * expr | expr + expr | (expr)左递归.但我可以使用pChainl组合器解决这个问题(参见parseExpr下面的例子).
剩下的问题(因此这个问题)是函数应用程序,其函数返回其他函数(f()()).同样,语法是递归的expr -> fun-call | ...; fun-call -> …
用于解析字符串的引擎(在Perl中称为"正则表达式")与书中术语"正则表达式"所知的非常不同.
所以,我的问题是:是否有一些文档描述了Perl的regexp实现,以及它与经典实现有何不同之处(通过经典我的意思是可以真正转换为普通DFA/NFA的正则表达式)以及如何有用?
谢谢.
我试图解析以下形式的行:
(OP something something (OP something something ) ) ( OP something something )
Run Code Online (Sandbox Code Playgroud)
其中 OP 是逻辑门(AND、OR、NOT)的符号,而某些东西是我想要评估的东西。
我正在寻找的输出类似于:
{ 'OPERATOR': [condition1, condition2, .. , conditionN] }
Run Code Online (Sandbox Code Playgroud)
其中条件本身可以是字典/列表对本身(嵌套条件)。到目前为止我尝试过类似的事情:
tree = dict()
cond = list()
tree[OP] = cond
for string in conditions:
self.counter += 1
if string.startswith('('):
try:
OP = string[1]
except IndexError:
OP = 'AND'
finally:
if OP == '?':
OP = 'OR'
elif OP == '!':
OP = 'N'
# Recurse
cond.append(self.parse_conditions(conditions[self.counter:], OP))
break
elif not string.endswith(")"):
cond.append(string)
else:
return …Run Code Online (Sandbox Code Playgroud) 我正在为配置文件编写一个递归下降解析器。这些大多类似于 ini 文件。这是某种类似 EBNF 形式的语言:
document ::= { category }
category ::= title {entry}
title ::= "[" <name> "]"
entry ::= <key> ":" <value>
Run Code Online (Sandbox Code Playgroud)
下面是一个在结尾处给出解析错误的文件示例:
[Category1]
key1:val1
key2 :val2
key3 : val3
[Category2]
key4: val4
this line right here should produce an error
Run Code Online (Sandbox Code Playgroud)
我可以在网上找到的所有示例都会解析输入,直到到达无效符号,然后退出而不打印有用的错误消息。我有一个遵循这种行为的工作解析器,但我不确定如何实现有用的错误报告。
例如,adocument由零个或多个类别组成。如果前两个类别解析没有错误,但第三个类别包含语法错误,我该怎么办?如果输入在第二个类别之后结束并且我无法解析第三个类别,因为没有留下标记(这不应该产生错误消息)怎么办?我如何区分这些情况?无效行可以通过两种方式变得有效:成为条目或成为标题。这让我很困惑。
我希望我的程序line 9: expected entry or title在到达上述输入的最后一行时打印类似的内容。人们通常如何在递归下降解析器中实现错误消息?
有人能用简单的术语解释一下递归下降解析器是什么吗?
我被困在试图得到它.在维基百科中解释的确非常模糊.
递归下降解析器是一种自上而下的解析器,它构建为一组递归过程,每个过程都实现了语法的生成规则.
那么,我能做对吗?解析器是一个程序,它以预定义的顺序逐个执行命令,每次执行时每个命令具有相同的含义,但它根据输入以某种方式调整输出,这意味着每次输入时调整都可能不同改变了.
而且我仍然不明白为什么在这里使用递归这个词.