【问题标题】:Lexical Analyzer Prolog词法分析器序言
【发布时间】:2019-06-07 16:18:13
【问题描述】:

我必须用 Prolog 和 C++ 做一个词法分析器。我在 C++ 中的 for 词法分析器正在工作,但我的序言代码有一些问题。我无法识别关键字

这是我的序言代码,不包括有效的关键字\

predicates

string_processing
det_lexical_atom_type(char)
is_identif(char)
is_op(char)
is_delim(char)
is_const(char)
p1(string)

clauses

string_processing:-write("Write the expression"),nl,readln(S),p1(S).
p1(S):-frontchar(S,C,R),det_lexical_atom_type(C),p1(R).
p1("#"):-!.

det_lexical_atom_type(C):-is_identif(C),write("\n Is identif",C).
det_lexical_atom_type(C):-is_op(C),write("\n is op",C).
det_lexical_atom_type(C):-is_delim(C),write("\n is delim",C).
det_lexical_atom_type(C):-is_const(C),write("\n is const",C).

det_lexical_atom_type(C):-write("\n Unknown lexical atom").

is_identif(C):-C='A'.
is_op(C):-C='+';C='*'.
is_delim(C):-C='(';C=')'.
is_const(C):-C='0';C='1'.

这是我修改后的序言代码以识别关键字,但它不起作用。程序停止读取我在第一个字母后给出的表达式,并且它不会继续识别表达式的其余部分。比如我输入T=3+a,它只读取T然后就停止了

predicates

string_processing
is_identif(char)
is_op(char)
is_delim(char)
is_const(char)
is_keyword(string)
p2(string)
determine_lexical_atom_type(char)
determine_keyword(string)

clauses

 is_identif(C):-C='A';C='B';C='C';C='D'.
 is_op(C):-C='+';C='-';C='/';C='*';C='='.
 is_delim(C):-C=';';C=',';C='(';C=')'.
 is_const(C):-C='0';C='1';C='2';C='3';C='4';C='5';C='6';C='7';C='8';C='9'.
 is_keyword(T):-T="if";T="while";T="do";T="switch";T="for";
    T="break";T="until";T="then".
 determine_keyword(T):-is_keyword(T),write("\nIs keyword: ",T).
 determine_lexical_atom_type(C):-is_identif(C),write("\nIs identif:",C).
 determine_lexical_atom_type(C):-is_op(C),write("\nIs operator: ",C).
 determine_lexical_atom_type(C):-is_delim(C),write("\nIs delimiter: ",C).
 determine_lexical_atom_type(C):-is_const(C),write("\n Is constant ",C).
 determine_lexical_atom_type(C):-write("\n Unknown lexical atom").
 p2(S):-  fronttoken(S,T,R),write("\nT=",T),determine_keyword(T),frontchar(R,C,R1),determine_lexical_atom_type(C),p2(R1).   
 p2("#"):-!.
 string_processing:-write("Write expression"),nl,readln(S),p2(S),nl.

【问题讨论】:

  • 您可能想要添加特定错误或未知行为。这样用户可以帮助您修复它。
  • 使用 TurboProlog 极大地限制了可以帮助您的人数。如果您使用的是像 SWI 这样的现代软件,您可能会得到更多帮助。

标签: prolog lexical-analysis


【解决方案1】:

问题很简单:

只需将determine_keyword/1 移动到fronttoken/3 之前,代码片段如下。之后,关键字识别应该可以工作了。

p2(S):-    
  determine_keyword(T), //output var
  fronttoken(S,T,R),
  write("\nT=",T),
  frontchar(R,C,R1),
  determine_lexical_atom_type(C), 
  fail.

p2(_). 

determine_keyword/1 生成所有回溯关键字的列表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2014-04-21
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多