- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我编写了一个解析器,它正确地接受一个表达式并从中创建一个 AST。然后我的解释器接受那个 AST,对其求值,然后返回一个解决方案。但是,我希望解析器(或解释器)能够解释表达式中的歧义(缺少括号)。
例如,如果我将类似 R ∩ G - B 的内容写为表达式,我希望看到返回 (R ∩ G) - B 和 R ∩ (G - B) 的 AST。我见过许多在解析表达式时消除歧义的解决方案,但我希望能够看到表达式的所有可能解释。
这是我的解析器类的一个片段:
def eat(self, token_type):
if self.current_token.type == token_type:
self.current_token = self.lexer.get_next_token()
else:
self.error()
def factor(self):
token = self.current_token
if token.type in (COLOR, EMPTY_S, UNIVERSE_OP):
self.eat(token.type)
return Num(token)
elif token.type == L_PAREN:
self.eat(L_PAREN)
node = self.expr()
self.eat(R_PAREN)
return node
def term(self):
node = self.factor()
while self.current_token.type is COMPLIMENT:
token = self.current_token
self.eat(COMPLIMENT)
node = BinOp(left = node, op = token, right = self.expr())
return node
def expr(self):
node = self.term()
while self.current_token.type in (UNION, INTERSECT, MINUS, SUBSET, EQUALS):
token = self.current_token
if token.type == UNION:
self.eat(UNION)
elif token.type == INTERSECT:
self.eat(INTERSECT)
elif token.type == MINUS:
self.eat(MINUS)
elif token.type == SUBSET:
self.eat(SUBSET)
elif token.type == EQUALS:
self.eat(EQUALS)
else:
self.error()
node = BinOp(left = node, op = token, right = self.expr())
return node
def parse(self):
return self.expr()
在我当前的设置下,解析器只会为 R ∩ (G - B) 返回一个 AST。
最佳答案
对于有歧义的语法,有一些解析算法会找到所有可能的方法来解析给定的字符串:Earley、CYK、Tomita、GLR、GLL。但是它们与您现在拥有的递归下降解析器相去甚远。 (GLL 声称类似于递归下降,但这似乎有点牵强。)
关于python - 故意为解析器/解释器添加歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55461543/
首先是我的对象: public class Group { private final ObservableList sourceList; private final Obser
我有一个 Circle 类和一个 Rectangle 类。我现在想创建一个类 FunnyObject,每个类都由一个圆和两个矩形组成。 如果我这样做: class FunnyObject:public
我正在阅读一篇博文 here关于用 node.js 创建一个刮板并遇到了一些有趣的 javascript,我无法完全理解。这正是我想在我的脚本中使用的东西,但作为一个新手,我不想在不知道它们首先做什么
我不明白为什么在成功之后我为什么看不到脚本中的错误(我用谷歌搜索,它只是给出了关于jquery get脚本成功/错误时错误处理的很多答案)。 如果我使用“any” js脚本执行此操作 $.getScr
我目前正在为我公司正在开发的设备( radio 编码器)开发单元测试。 可以通过 SNMP(仅限 v1)访问各种统计信息,其中您可以获得由于各种原因丢弃的 UDP 数据报的数量。 我希望能够发送一个包
这是一个令人费解的问题。我运行良好的 ASP.NET 3.5 应用程序突然开始出现超时错误... System.Data.SqlClient.SqlException:超时已过。操作完成前超时时间已过
我正在尝试掌握 C++ 内存管理的窍门,并尝试使用无限循环的新语句故意使我的程序崩溃。据我了解,这只会在内存堆上保留越来越多的空间。但是我的程序不会崩溃。在 Windows 任务管理器中监控它,它将使
我是一名优秀的程序员,十分优秀!