2009-07-16 37 views
6

Tôi biết điều này là ngớ ngẩn nhưng tôi không thể vượt qua sự tò mò của mình. Có thể viết một kịch bản lệnh shell để định dạng một đoạn mã java không?Định dạng mã Java bằng cách sử dụng tập lệnh shell

Ví dụ, nếu một người dùng viết trong một mã số:

public class Super{ 
    public static void main(String[] args){ 
    System.out.println("Hello world"); 
    int a=0; 
    if(a==100) 
    { 
    System.out.println("Hello world"); 
    } 
    else 
    { 
    System.out.println("Hello world with else"); 
    } 
    } 
} 

Tôi muốn viết một kịch bản shell mà sẽ làm cho đoạn code như thế này.

public class Super 
{ 
    public static void main(String[] args) 
    { 
    System.out.println("Hello world"); 
    int a=0; 
    if(a==100){ 
    System.out.println("Hello world"); 
    } 
    else{ 
    System.out.println("Hello world with else"); 
    } 
} 

Để chính xác, chúng ta nên thay đổi định dạng khung hoa. Nếu nó là try/catch hoặc các cấu trúc điều khiển, chúng ta nên thay đổi nó thành cùng một dòng và nếu nó là hàm/method/class nó sẽ đến trong dòng tiếp theo. Tôi có ít kiến ​​thức về sed và awk, có thể làm nhiệm vụ này dễ dàng. Ngoài ra tôi biết điều này có thể được thực hiện bằng cách sử dụng nhật thực.

+1

Có thể đáng để thay đổi câu hỏi của bạn, bạn đang hỏi về định dạng, không xác thực. –

+0

+1 cho cụm từ "dấu ngoặc vuông" 8-) – RichieHindle

+0

thay đổi tiêu đề nhờ :) – Harish

Trả lời

5

Vâng, tôi đã có một số miễn phí trên bàn tay của tôi, vì vậy tôi quyết định sống lại những ngày Linux cũ của tôi:]

Sau khi đọc một chút về awk và sed, tôi đã quyết định sử dụng cả hai, vì dễ dàng thêm thụt đầu dòng trong awk và phân tích chuỗi trong sed.

Đây là ~/sed_script rằng các định dạng tập tin nguồn:

 # delete indentation 
    s/^ \+//g 

    # format lines with class 
    s/^\(.\+class.\+\) *\({.*\)$/\1\n\2/g 

    # format lines with methods 
    s/^\(public\|private\)\(\+static\)\?\(\+void\)\? \+\(.\+(.*)\) *\({.*\)$/\1\2\3 \4\n\5/g 

    # format lines with other structures 
    /^\(if\|else\|for\|while\|case\|do\|try\)\([^{]*\)$/,+1 { # get lines not containing '{' 
                  # along with the next line 
     /.*{.*/ d    # delete the next line with '{' 
     s/\([^{]*\)/\1 {/g # and add '{' to the first line 
    }

Và đây là ~/awk_script có thêm thụt đầu dòng:

 BEGIN { depth = 0 } 
    /}/ { depth = depth - 1 } 
      { 
       getPrefix(depth) 
       print prefix $0 
      } 
    /{/ { depth = depth + 1 } 

      function getPrefix(depth) { 
       prefix = "" 
       for (i = 0; i < depth; i++) { prefix = prefix " "} 
       return prefix 
      }

Và bạn sử dụng chúng như thế:

 > sed -f ~/sed_script ~/file_to_format > ~/.tmp_sed 
    > awk -f ~/awk_script ~/.tmp_sed

Cách xa công cụ định dạng phù hợp, nhưng tôi hy vọng nó sẽ hoạt động như một tập lệnh mẫu để tham khảo:] od may mắn với việc học của bạn.

+1

Tuyệt vời .... Bạn đá dude ... – Harish

+0

Bệnh. Hấp dẫn… nhưng, chắc chắn là một dấu hiệu của một tâm trí bị xoắn ;-) –

+0

Kirill, tôi đã sao chép 'sed_script' của bạn nhưng vì một lý do nào đó tôi nhận được một lệnh bị cắt xén trên dòng' "/^\ (nếu \ | else \ ..." Bất cứ ý tưởng nào có thể là lý do? – Nik

0

Hãy xem số CLI for Jalopy. Jalopy là một trình định dạng nguồn khá mạnh.

+0

Tôi chỉ muốn biết là nó có thể làm thông qua shell script.There là phần mềm umpteen để định dạng mã nhưng tôi yêu cầu là nó có thể với awk hoặc sed – Harish

+0

Công bằng đủ. Mặc dù tôi muốn làm rõ nó ở gần đầu câu hỏi của bạn rằng bạn đang làm điều này như một bài tập học tập cho sed/awk, hoặc bạn sẽ nhận được một loạt các câu trả lời như tôi –

+0

Đồng ý. Shell script thực hiện các chương trình. Nếu có một số lượng hạn chế các chương trình, bạn nên đề cập đến trong câu hỏi. Tôi tưởng tượng câu hỏi là bởi vì một người muốn định dạng lại một số lượng lớn các tập tin, hoặc muốn định dạng lại trên cam kết với một kho lưu trữ nguồn. Tôi sẽ đề nghị các kịch bản gọi vim, đó là khả năng định dạng khá linh hoạt. – brianegge

1

Chắc chắn là có thể ... Tôi chỉ không hiểu tại sao bạn lại muốn dành thời gian làm việc đó? :] Có đủ các công cụ để làm điều đó và bất kỳ IDE phong nha nào cung cấp một cách để định dạng lại mã nguồn (bao gồm cả Eclipse).

Ví dụ, định dạng trong Eclipse 3.4 (nên tương tự trong các phiên bản khác) chỉ cần nhấp chuột phải vào dự án của bạn hoặc tệp và chọn "Nguồn> Định dạng" từ trình đơn.

Và nếu bạn cần thay đổi cách định dạng mã, chỉ cần chuyển đến "Tùy chọn> Java> Kiểu mã> Định dạng" và thay đổi mẫu. Theo như tôi biết, nó rất giống với JDeveloper và NetBeans.

+0

Có mate.Chỉ muốn tìm hiểu thêm về sed và awk more.I nghĩ rằng một số chuyên gia sẽ đưa ra một số ý tưởng về nó. Ngay cả tôi đã đề cập rằng ngớ ngẩn của nó :) – Harish

+0

Oh, xin lỗi sau đó :) Có lẽ bạn nên bắt đầu với đọc trang người đàn ông của họ và + một số thông tin về cách sử dụng cụm từ thông dụng? –

1

Tôi nghĩ điều này có thể được thực hiện thông qua một tập lệnh 'sed' đơn giản. Sử dụng 1 biến (bCount) để lưu trữ số lượng '{' (dấu ngoặc mở) - (trừ) số tiền '}' (dấu ngoặc đóng) Sau đó, tôi sẽ đi qua tệp và chèn 'tab' theo thực tế đếm các bracets được sử dụng. Vì vậy

public class Super{ //bCount=0 
public static void main(String[] args){ //bCount=1 
System.out.println("Hello world"); //bCount=2 
int a=0; //bCount=2 
....and so on 

nên instert 0 tab trên dòng 0

1 tab trên dòng 1

2 tab trên dòng 3 và 4 và vân vân ...

+0

bạn có thể xây dựng ... tôi nghèo trong cú pháp – Harish

2

Một cách nhanh chóng, thiếu sót nỗ lực, mà còn hoạt động trên đầu vào mẫu của bạn:

BEGIN {depth = 0;} 
/{$/ {depth = depth + 1} 
/^}/ {depth = depth - 1} 
     {prefix = ""; for (i = 0; i < depth; i++) { prefix = prefix " "} print prefix $0 ; } 

Đây là một kịch bản awk: đặt nó trong một tập tin và làm

awk -f awk_script_file source_file 

sai sót rõ ràng với điều này bao gồm:

  • Nó không bắt các địa điểm không nơi bạn muốn thụt đầu dòng như

    if (foo) 
        bar(); 
    
  • Nó sẽ thay đổi độ sâu thụt lề dựa trên niềng răng trong ý kiến ​​và xâu

  • Nó sẽ không phát hiện {dấu ngoặc tiếp theo ý kiến ​​
+0

bạn đời làm việc tuyệt vời.Đánh giá cao bạn đời thời gian của bạn – Harish

0

Cân nhắc sử dụng Jindent, đây là "Công cụ thụt lề Java đơn giản sử dụng Emac". Đó là một kịch bản shell miễn phí, là một phần của dự án Ptolemy tại Berkeley.

Các vấn đề liên quan