2013-02-08 18 views
15

Verilog (veya vhdl) dilinin bir ayrıştırıcısını yazacağım ve ayrıştırılan verilerin çok sayıda manipülasyonunu (dönüşüm çeşitlerini) yapacağım. Gerçekten büyük dosyaları (tam Verilog tasarımları, 10K satır kadar büyük) ayrıştırmak niyetindeyim ve en sonunda Verilog'un çoğunu destekleyeceğim. Yazmayı umursamıyorum, ancak başka bir kural için destek eklediğimde kodun herhangi bir bölümünü yeniden yazmak istemiyorum.Parsec veya mutlu (alex ile) veya uu-parsinglib

Haskell'de hangi kütüphaneyi önerirsiniz? Haskell'i tanıyorum ve daha önce Happy'i (oynamak için) kullandım. Parsec'i kodda ayrıştırılmış dizeyi dönüştürmek için kullanma imkanlarının olduğunu hissediyorum (bu büyük bir artı). Uu-paringlib ile hiç deneyimim yok.

Tam bir gramer verilog/VHDL ayrıştırmak için bunlardan biri tavsiye edilir? Benim asıl endişem, ayrıştırılmış veriyi kendi başıma kullanabileceğim kolaylık ve 'doğruluk'. Hız öncelikli bir sorun değildir.

+0

Bu büyük bir projedir. Bir Verilog ayrıştırıcı çok karmaşıktır. –

+4

Evet, gerçekten. Verilogun bir kısmını desteklemek, doktora sırasında verilog ile yapmak istediğimi göstermek için yeterince iyi. ama doktora sonrası bile devam etmek istiyorum. Yani gerçekten uzun vadeli bir yatırım. Haskell'in tasarıya uyup uymadığını bilmek istiyorum. Bu dili seviyorum. – Dilawar

+1

Peki, sonunda ne yaptın? Seçiminizden memnun musunuz? – Schiavini

cevap

19

Kişisel olarak Parsec'i lexing için Alex'in yardımıyla tercih ediyorum.

Parsec'i Happy üzerinde tercih ederim çünkü 1) Parsec bir kütüphanedir, Happy ise bir programdır ve Happy'i kullanıp sonra Happy ile derlerseniz farklı bir dilde yazacaksınız. 2) Parsec, monadik arayüzü sayesinde içeriğe duyarlı ayrıştırma yetenekleri sunar. Bağlam duyarlı ayrıştırma için ekstra durumu kullanabilir ve ardından o duruma bağlı olarak inceleyerek karar verebilirsiniz. Veya daha önce ayrıştırılmış değere bakın ve sonraki ayrıştırıcılara vb. Karar verin (a <- parseSomething; if test a then ... do ... gibi) Ve içeriğe duyarlı bir bilgiye ihtiyacınız olmadığında, uygulama stilini kullanabilir ve YACC veya benzeri bir araçta uygulanan gibi bir uygulama gerçekleştirebilirsiniz. .

Parsec'in bir dezavantajı olarak, Parsec çözümleyicinizin soldan bir yineleme içerip içermediğini ve çözümleyicinizin çalışma zamanında takılıp kalmayacağını asla bilmeyeceksiniz (çünkü Parsec temel olarak yukarıdan aşağıya özyinelemeli bir ayrıştırıcıdır). Sola dönüşleri bulup ortadan kaldırmak zorundasın. YACC stili ayrıştırıcılar, Parsec ile alamadığınız bazı statik garantiler ve bilgiler sağlayabilir (vardiyaları azaltma/çatışmaları, kullanılmayan terminalleri vb.).

Alex son derece iki durumda da Lexing için önerilir ( seni mutlu ile devam etmeye karar eğer kullanım Alex zorunda düşünüyorum). Çünkü Parsec'i kullansanız bile, çözümleyici uygulamanızı gerçekten basitleştirir ve çok sayıda hata yakalar (örneğin: bir anahtar kelime tanımlayıcı olarak ayrıştırmak, Parsec'i Alex olmadan kullanırken yaptığım ortak bir hataydı.).

Alex + Parsec uygulamasında uygulanmış olan Lua parser numaralı telefona bir göz atabilirsiniz. Ve işte code to use Alex-generated tokens in Parsec.

DÜZENLEME: Düzeltmeler için teşekkürler John L. Görünüşe göre sen de Mutlu ile içerik duyarlı ayrıştırma yapabilirsin. Ayrıca, tavsiye için olsa da, Alex için lexing gerekli değildir.

+0

Lua ayrıştırıcınızı paylaştığınız için teşekkür ederiz. Alex'i bedende görmek yararlıdır, ve sadece belgelerin bazı oyuncak örneklerini değil. Çalışmanızı paylaşmak için –

+0

+1. – Dilawar

+4

Bu cevapta Mutlu ile ilgili ayrıntıların çoğu yanlıştır.Mutlu, içeriğe duyarlı ayrışmayı destekler (ayrıştırıcılar rasgele monadlarda çalıştırılabilir). Mutlu Alex gerektirmez, herhangi bir lexer kullanabilirsiniz. Lexing'i doğrudan Mutlu'da bile yapabilirsiniz, ancak bu tavsiye edilmez. –

İlgili konular