我目前正在开发编译器。最近,我偶然发现了一个有关表达式中运算符解析的问题。显然,我还没有发现这在其他语言中是一个问题,这让我认为很可能有一个我尚未想到的友好解决方案来解决这个问题。
像
a = 32*-1
这样的表达式中 *
和 -
是单独的运算符,但开发人员选择将它们组合起来。一种可能性是强制运算符空格分隔。不过,我宁愿不。
我当前的操作员设置可以轻松实施新操作员。然而,就目前而言,这使得运算符查找更加昂贵。我想让我的操作员不必遵守任何规则;不应将任何运算符设计为在编写时不可能被解析为运算符。我的意思是,例如添加一条规则,例如如果运算符以括号开头,它将被拆分以处理像
a = (*ptr).member_value
这样的表达式。我不想要这样的规则,因为它会对以括号开头的运算符施加限制。
我想过做一些事情,比如从头开始找到最长的连续运算符,这是一个有效的运算符,然后在那里拆分。我想知道这是否是一个有效的解决方案以及是否会导致一些问题。如果有任何关于这个主题或标准算法的讨论,我们也将不胜感激。
根据 sepp2k 的建议,我尝试使用“最大咀嚼”又名“最长匹配”来解决这个问题,目前效果很好。
在简短的 Wikipedia 页面上查看有关该主题的更多信息。