6887
6692
我目前正在为XML风格编写基本的解析器。作为练习,我将实现一个LL表驱动的解析器。
这是我的BNF语法示例:
%令牌名称数据字符串
%% / * LL(1)* /
doc:elem
元素:“ <” open_tag
open_tag:名称attr close_tag
close_tag:“>” elem_or_data“ ”
| “ />”
;
elem_or_data:“ <” open_tag elem_or_data
|数据elem_or_data
| / * epsilon * /
;
attr:名称“:”字符串attr
| / * epsilon * /
;
这个语法正确吗?
每个终端文字都在引号之间。抽象终端由%token指定。
我正在编写一个手写词法器,以将我的输入转换成令牌列表。我将如何标记抽象终端? 
经典方法是为每个可能的终端编写一个正则表达式(或其他识别器)。
您所谓的“抽象”终端,实际上是非常具体的终端,其关联的模式可以识别多个可能的输入字符串。实际识别的字符串(或该字符串的某些计算函数)应作为标记的语义值传递给解析器。
名义上,在输入字符串的每个点上,令牌生成器将运行所有识别器,并选择匹配时间最长的识别器。 (这是所谓的“最大嚼数”规则。)通常可以对其进行优化,尤其是当所有模式都是正则表达式时。例如,(F)lex将为您进行优化。
您的情况的复杂之处在于,语言的标记化取决于上下文。特别是,当目标是elem_or_data时,唯一可能的标记是<,