在语义操作中引发异常后,是否可以回退到其他规则?就像下面这个(人为的)场景: var = /[a-zA-Z]+/;
keyword = 'for' | 'in';
a = var:var | keyword:keyword;
def a(ast):
if (ast.var not in symbolTable):
raise Exception() 当异常被引发时,解析将继续执行“关键字”规则。我知道@@keyword特性,但我想在运行时声明关键字(我的解析器用于具有用户定义操作符的编程语言)。
让我问一下,antlr3是否接受下面的示例语法。
for an input , x + y * z ,
it is parsed as x+(y*z) if each in {x,y,z} is a number;
it is parsed as (x+y)*z if each in {x,y,z} is an object of a particular type T;
让我问一下,这种语法在计算机语言中是偶尔使用还是很少使用。
非常感谢。
使用FluentValidation,是否可以在单个规则失败时抛出异常?例如,我想调用Validate(),让下面的第一个规则简单地进行验证,但第二个规则在false的情况下抛出异常。
RuleFor(x => x.Title)
.NotEmpty()
.WithMessage("Please add a title for the project");
RuleFor(x => x.UserId)
.NotEmpty()
.WithMessage("User not supplied");
我可能正试图迫使Flue
我对整个try catch代码块感到困惑。我知道如果抛出一个异常,它会执行catch块,但是我对在try块中使用return有一个问题。
try {
//other logic is here
//this is in laravel and sends the user back and should stop operation
if (foo != bar) {
return Redirect::back()->with_message('This auction is closed.', 'error');
我的C#控制台应用程序项目中有一个事件处理程序,当用户的更新到达时(聊天机器人场景)就会触发该事件处理程序。问题是,即使我在事件处理程序中使用await,当代码到达想要从数据库中获取用户数据的时候,我仍然会得到一个异常(无效的操作异常)。
另一方面,当我放弃事件处理程序并使用长轮询技术获取更新时,我不会遇到这个问题。我认为这个事件处理程序可能会为它接收到的每一个更新创建一个新线程,所以这就是抛出这个异常的原因。我想知道我是否可以使用事件处理程序而不是面对这个问题?这是我的代码:
public class TelegramService : IChatbotService
{
在实际运行代码之前,我可以使用antlr v4进行语法检查吗?
例子:
我定义了语法:select * from table,在实际执行它之前,我想知道语句是否正确。
以下是我的代码:
val listener = new SQLListener()
val loadLexer = new SQLLexer(new ANTLRInputStream(input))
val tokens = new CommonTokenStream(loadLexer)
val parser = new SQLParser(tokens)
val stat = parser.statement()
我试
我正试图用Java语言编写一个命题逻辑程序,以确定公式是否格式良好。显然,ANTLR是一个很好的选择,因为我可以在一个CFG中编写所有的规则。所有这些都很好,而且我的语法工作得很好(它可以检测公式是否正确)。然而,这个程序是针对这门学科的初学者,我想告诉他们在输入公式时哪里出了问题。
如果我输入公式(A -> B,解析器会识别这不是格式良好的,因为它缺少一个结束括号。然而,它所产生的错误至少可以说是平淡无奇的:line 1:5 no viable alternative at input '(A -> B' (这是从vanilla中略作修改,以包括行号iirc)。我
目前,没有对XML标记相同的限制:
element : '<' Name attribute* '>' content '<' '/' Name '>'
所以它将与<boo>text</bar>完美地匹配
Antlr4语法本身不是限制“名称”在“内容”两边相同的合适位置吗?那么正确的方法是使用侦听器/访问者来报告这种不一致吗?
考虑像子集(⊂)这样的infix运算符。子集运算符不是关联的,因为它的结果(布尔值)本身不是一个集合,因此不能输入子集运算符的一个或另一侧。考虑:
S ⊂ T ⊂ M
理想情况下,这将是一个解析失败,但树保姆似乎不允许基于操作符冲突的解析失败;相反,它要求您在解析器生成时通过指定关联性或优先级来明确地解决冲突。有没有办法向树保姆指出这应该是一个解析冲突?不仅适用于同类型的非结合算子,也适用于具有等价优先级且非结合的不同算子之间,例如:
S ⊂ T ⊆ M
或者是唯一的解决方案来指定一个明确的解析,然后在语义级别处理这个问题?
我有一个函数,它有多个sys.exit()异常。我是在迭代地调用函数,并且希望循环继续,如果某个sys.exit()被引发,而所有其他的错误都被抛出。示例代码可以如下所示:
def exit_sample(test):
if test == 'continue':
sys.exit(0)
else:
sys.exit("exit")
list = ["continue", "exit", "last"]
for l in list:
在实现真实世界(TM)语言时,我经常会遇到这样的情况:
(* language Foo *)
type A = ... (* parsed by parse_A *)
type B = ... (* parsed by parse_B *)
type collection = { as : A list ; bs : B list }
(* parser ParseFoo.mly *)
parseA : ... { A ( ... ) }
parseB : ... { B ( ... ) }
parseCollectionElement : parseA { .. } | parseB {