%% 词法分析jscan.xrl
Definitions.
D = [0-9]
D1 = [1-9]
Rules.
[\s\t\r\n]+ : skip_token.
{ : {token, {'{', TokenLine}}.
} : {token, {'}', TokenLine}}.
\[ : {token, {'[', TokenLine}}.
\] : {token, {']', TokenLine}}.
\: : {token, {':', TokenLine}}.
, : {token, {',', TokenLine}}.
null : {token, {constant, TokenLine, undefined}}.
true : {token, {constant, TokenLine, true}}.
false : {token, {constant, TokenLine, false}}.
(\+|\-)?{D1}{D}* :
{token, {number, TokenLine, list_to_integer(TokenChars)}}.
(\+|\-)?(0|{D1}{D}*)\.{D}+((e|E)(\+|\-)?{D1}{D}*)? :
{token, {number, TokenLine, element(1, string:to_float(TokenChars))}}.
"[^"]*" :
{token, {string, TokenLine, lists:sublist(TokenChars, 2, TokenLen - 2)}}.
Erlang code.
%% 语法分析jparse.yrl
Nonterminals object pairs pair value array values.
Terminals '{' '}' ':' '[' ']' ',' number constant string.
Rootsymbol object.
object -> '{' '}': [].
object -> '{' pairs '}': '$2'.
pairs -> pair: ['$1'].
pairs -> pair ',' pairs: ['$1' | '$3'].
pair -> string ':' value: {value_of('$1'), '$3'}.
value -> array: '$1'.
value -> object: '$1'.
value -> constant: value_of('$1').
value -> number: value_of('$1').
value -> string: value_of('$1').
array -> '[' ']': [].
array -> '[' values ']': '$2'.
values -> value: ['$1'].
values -> value ',' values: ['$1' | '$3'].
Erlang code.
value_of(Token) ->
element(3, Token).
%% 生成和编译
Eshell V5.7.4 (abort with ^G)
1> leex:file(jscan), c(jscan).
{ok, jscan}
2> yecc:file(jparse), c(jparse).
{ok, jparse}
源代码可以从下载
阅读(2009) | 评论(0) | 转发(0) |