【发布时间】:2020-01-26 13:52:06
【问题描述】:
我正在为 flex 中的 java 编写一个词法分析器。 java规范说:
“在每一步都使用尽可能长的翻译,即使结果最终不会产生正确的程序,而另一个词法翻译会。有一个例外:如果词法翻译发生在类型上下文中(第 4.11 节) ) 并且输入流有两个或多个连续的 > 字符后跟一个非 > 字符,则每个 > 字符必须转换为数字比较运算符 > 的标记。”
那么如何区分右移运算符和 <List<List>> 中的类似运算符?
【问题讨论】:
-
"那么我如何区分右移运算符和
<List<List>>中的类似内容?" - 根据上下文。右移是算术表达式的一部分,而泛型是构造函数调用、方法签名、类型或类定义的一部分。 -
这里我问的是如何在我的词法分析器(lex 代码)中区分它们。
-
如果您的扫描仪只标记化,那么遇到哪个
>是无关紧要的。>是>,没有区别。然后由解析器确保语法正确性。但是,如果扫描器确实有评估器,那么扫描器需要上下文信息,因为 the grammar of Java is context-sensitive。 -
@Turing85:不是这样。在大多数语言中,
>>是单个标记(如>=)。如果>>是两个标记,则语法将接受像2> >3甚至2 >/* This is a right shift* /> 3这样的表达式,这通常是不被接受的。
标签: java compiler-construction flex-lexer lexer