【问题标题】:Lexing compressed data对压缩数据进行词法分析
【发布时间】:2014-04-03 01:38:08
【问题描述】:

我正在学习使用 lex 和 yacc。这是一个关于词法分析和定义词法规则的哲学问题。

假设您要为 csv 文件中的表格数据生成编译器。其中一个字段包含缩写和连接数据。

VALUE1,VALUE2,I-40
VALUE3,VALUE4,US-66

最终,您会关心这条路是州际公路还是美国高速公路。当您对这些值进行词法分析时,您应该标记道路标识符,然后让编译器将 I/US 从数字中分离出来并处理它,还是词法分析器应该在前端执行此操作?

【问题讨论】:

  • “I”和“-40”之间可以有空格吗?如果不是,那显然是一个令牌。虽然我不建议对这样的语法进行任何词法分析。

标签: compiler-construction flex-lexer lex lexical-analysis


【解决方案1】:

虽然这个问题非常开放,并且准确的答案可能是“取决于”,但通常情况下,词法分析器在词法分析独立于上下文时工作得最好。换句话说,如果字段I-40 应该被视为州际引用,无论它出现在哪里,那么在词法分析器中解释它可能是可以的。另一方面,如果某些字段需要解释而其他字段不需要,则在不同级别处理解释可能更合适。所以,例如:

M-Lee,"New York",I-40
I-40,Chicago,US-66

第二行第一个字段中的I-40 是高速公路,还是只是一些看起来像高速公路的代码?在第二种情况下,使用这样的解析器规则可能更合适:[1]

data: code ',' city ',' highway '\n' { $$ = MakeData($1,$3,$5); }
code: FIELD { $$ = MakeCode($1); }
city: FIELD { $$ = $1; }
highway: FIELD { $$ = MakeHighway($1); }

在第一种情况下,您可能有:

coded_data: CODE ',' FIELD ',' HIGHWAY '\n'
path_data:  HIGHWAY ',' FIELD ',' HIGHWAY '\n' 

假设FIELD从不CODEHIGHWAY 混淆。 (或者,您可以尝试将解析后的 HIGHWAY 重新组合到一个简单的字段中,但这也变得有些难看。)

所以,总的来说,我会选择以下策略之一:

  1. 在解析器调用的单独函数中处理词法解释(如我上面的第一个示例)

  2. 在词法分析器中进行词法解释,利用flex提供的正则表达式语言,但也保留未解释的字符串,并在解析器中决定你需要两者中的哪一个。 (在这种情况下,语义值是一个更复杂的struct。)

【讨论】:

    猜你喜欢
    • 2015-05-05
    • 2011-02-25
    • 2011-11-29
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多