我对是否允许以下情况感到困惑:
declaration :
operand ASSIGNMENTOPERATOR variable var_type CONST?
|operations ASSIGNMENTOPERATOR variable var_type CONST?
|funcall ASSIGNMENTOPERATOR variable var_type CONST?
|(funcall|operand|NOINDEXARRAY) ASSIGNMENTOPERATOR variable var_type ARRAY CONST? ;
forloop :
block
(LPARENS ((number_operation ASSIGNMENTOPERATOR variable)|number_functions)
SEMICOLON bool_operation
SEMICOLON declaration
RPARENS
)
'for'
;
UPDATE:我知道当我在for循环中提供正确的声明类型时,它就会工作。问题是如果我不这样做会发生什么?
您所考虑的似乎是一个语义阶段,这在解析器设置中非常典型。解析输入只是工作的一小部分。通常,在此之后要进行一个步骤来验证解析树(例如,查找重复的变量名或未知的符号,并检查其他条件)。这通常被称为语义阶段(解析是句法阶段)。
您可以使用这个语义阶段进行所有类型的错误检查,包括声明
检查(无论您想在那里检查什么,您的问题并不清楚)。
可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?
如果没有引用,会导致解析发生更改吗?
谢谢回复! 皮特
请考虑这个非常简化的示例,其中应该匹配以下形式的输入 如果您需要一个简单的实际应用程序,那么您可以考虑Java中的字符串。其中一些可能是需要用完全不同的解析器解析的regex。它类似于您可以在IDEA内部使用的注入语言。 问:在ANTRL4中是否有一种惯用的方法来用不同的语法解析特定的规则?最好的情况是,我可以在语法级别上指定它,以便生成的AST是包含注入语言的子树的外部语言的组合。
我正在为用ANTLR4编写的Decaf编程语言创建解析器和lexer规则。我试图解析一个测试文件,但不断地得到一个错误,一定是语法有问题,但我无法理解。 我的测试文件如下所示: 错误是:第2行:8不匹配的输入“10”应为INT_LITERAL 下面是完整的decaf.g4语法文件
我的语法在很大程度上必须忽略空格,除非在某些上下文中。这个问题的答案建议定义特定的lexer规则来处理我想要的异常。 问题是(我认为)我不能在lexer级别处理这种情况,因为它们似乎是在解析器级别被触发的。 更具体地说:我想认识一些东西,比如 记住我有一个WS- 在Xtext中,规则可以在规则范围的基础上指定在规则范围内应用哪些隐藏令牌: 但是我对antlr4一无所知。