加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

翻译scala StdLexical的新行?

发布时间:2020-12-16 09:04:57 所属栏目:安全 来源:网络整理
导读:我正在尝试lex(然后解析)一个C语言.在C中有预处理器指令,其中换行符很重要,然后是实际代码,它们只是空格. 执行此操作的一种方法是执行像早期C编译器这样的双通过程 – 为#指令设置单独的预处理器,然后将其输出调整为lex. 但是,我想知道是否可以在一个词法分
我正在尝试lex(然后解析)一个C语言.在C中有预处理器指令,其中换行符很重要,然后是实际代码,它们只是空格.

执行此操作的一种方法是执行像早期C编译器这样的双通过程 – 为#指令设置单独的预处理器,然后将其输出调整为lex.

但是,我想知道是否可以在一个词法分析器中完成它.我很高兴编写scala解析器 – 组合器代码,但我不太确定StdLexical如何处理空格.

有人可以写一些简单的示例代码,说可以使用#include行(使用换行符)和一些简单的代码(忽略换行符)吗?或者这是不可能的,最好选择2-pass appproach?

解决方法

好的,我自己解决了这个,回答这里的后代.

在StdLexical中,您已经能够在词法分析器中指定空格.您所要做的就是适当地覆盖您的令牌方法.这是一些示例代码(删除了非相关位)

override def token: CeeLexer.Parser[Token] = controlLine 
  // | ... (where ... is whatever you want to keep of the original method)
def controlLine = hashInclude

def hashInclude : CeeLexer.Parser[HashInclude] =
  ('#' ~ word("include") ~ rep(nonEolws)~'"' ~ rep(chrExcept('"','n',EofCh)) ~ '"' ~ 'n' |
   '#' ~ word("include") ~ rep(nonEolws)~'<' ~ rep(chrExcept('>',EofCh)) ~ '>' ~ 'n' ) ^^ {
   case hash~include~whs~openQ~fname~closeQ~eol =>  // code to handle #include
 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读