TXL语法基础
文章目录
1 解析阶段
Txl主要使用语法理论中的标准术语:token/终结符、非终结符、解析树
还有一些不标准的术语:模式、类型、变量、程序、修饰符
1.1 token
语法 | 说明 | 实例 |
---|---|---|
[id] | 标识符 | a A xyz a_long_name |
[number] | 正数 | 3 3.4 (not -2.3) |
[charlit] | 字符串(单引号) | ‘this’ |
[stringlit] | 字符串(双引号) | “that” |
[comment] | 注释 | 由Comments语句指定,使用命令行选项"-comment" |
[space] | 空白符、制表符 | |
[newline] | 换行符 | NL(unix)、CR LF(windows) |
[empty] | 始终匹配且不消耗输入内容 | |
[key] | 关键字 | 有Keys语句指定 |
[any] | 通用符号 |
1.2 修饰符
括在方括号中的任何 都可以通过修饰符进行修饰,如果要修改的项目是显式标识符或终结符,则必须使用前导单引号引用它。例如,[opt’;]表示可选分号,而[opt;]表示非法。
修饰符 | 说明 | 使用实例 | 实例说明 | 缩写 |
---|---|---|---|---|
opt | 当前类型是可选的 | [opt elseClause] | else子句可有可无 | [X?] |
repeat | 匹配当前类型0个或多个序列 | [repeat id] | 0个或多个连续标识符 | [X*] |
repeat+ | 匹配当前类型1个或多个序列 | [repeat statement+] | 1个或多个连续语句 | [X+] |
list | 匹配","分割的序列(可能为空) | [list formalParameter] | 0个或多个参数 | [X,] |
list+ | 匹配","分割的序列(不能为空) | [list formalParameter+] | 1个或多个参数 | [X,+] |
attr | 暂时存储当前符号的某些属性 | - | ||
see | 匹配前缀 | [see X] | 以X为前缀 | [:X] |
not | 不匹配前缀 | [not X] | 不以X为前缀 | [~X] |
push | 匹配当前与下一pop标记的两个非终结符 | 实例如下 | [>X] | |
pop | 与pop配对 | 实例如下 | [<X] |
实例1:记录id对应的类型,并在反解析阶段输出
---------
解析阶段:
define typeName
'int | 'string
end define
define typed_id
[id] [attr typeName] % [attr] means that the [typeName] is an
% optional attribute
end define
---------
反解析阶段:
function inferTypeFrom Expn [expression]
replace [typed_id]
Id[id]
deconstruct Expn
% checks to see whether the expression is a
% binary operation acting on two numbers
First [number] Op [binary_operator] Second [number]
by
Id 'int
end function
实例2:仅解析其开始(push)和结束标记(pop)标识符匹配的元素
define matched_tag
< [push id] > [repeat content] </ [pop id] >
end define
1.3 语句
1)Keys语句
实例:将program等标记为关键字,其中“end”为TXL自身关键字,前面需要添加转义字符"’"
keys
program procedure function
repeat until for while do 'end
end keys
2)Compounds语句
实例:将:=等多字符序列识别成1个token,其中“%”为TXL自身关键字,前面需要添加转义字符"’"
compounds
:= <= >= -> <-> '%=
end compounds
3)Comments语句
实例:列出了输入语言的注释括号,每行一对。
comments
//
/* */
end comments
4)Tokens语句
实例:扩展token类别,将"0[Xx][\dABCDEFabcdef]+"正则式表示为hexnumber
tokens
hexnumber "0[Xx][\dABCDEFabcdef]+