简单的dcg词法分析器

时间:2012-04-21 10:56:04

标签: prolog dcg

你好我正在写一个简单的词法分析器

:- module(lekser, [lekser/3]).


lekser(Tokens) -->
    white_space,
    (
            (
                   "{",  !, { Token = tkLBrace }
                ;  "}",  !, { Token = tkRBrace }
                ;  ")",  !, { Token = tkRParen }
                ;  "(",  !, { Token = tkLParen }
                ;  ";",  !, { Token = tkSColon }
                ;  "\",  !, { Token = tkLambda }
                ;  "->", !, { Token = tkImpli }
                ;  "<",  !, { Token = tkLT }
                ;  ">",  !, { Token = tkGT }
                ;  "<=", !, { Token = tkLeq }
                ;  ">=", !, { Token = tkGeq }
                ;  "=",  !, { Token = tkAssgn }
                ;  "\=", !, { Token = tkNeq }
                ;  "+",  !, { Token = tkPlus }
                ;  "-",  !, { Token = tkMinus }
                ;  "*",  !, { Token = tkTimes }
                ; "div", !, { Token = tkDiv }
                ; "mod", !, { Token = tkMod }
                   ...
        ...)).

这是代码的开头,有人告诉我,我犯了什么错误,因为swi代码编辑说有一个错误(即使只放了几个空的nelines)Syntax error: String too long (see style_check/1)

...  好吧,我发现了什么原因,但我不知道为什么它的工作原理就像这个编辑器以某种奇怪的方式解析"\"并且我必须使它"\""然后因为我也许它不会是\运营商,但“如何改变它?

1 个答案:

答案 0 :(得分:1)

只是为了扩大我的回答,是的,使用"\""您输入一个带有双引号"的字符串。例如:

?- write("\"abc\"").
[34,97,98,99,34]

注意字符串abc是如何被两个34值包围的(ASCII中的双引号)。